fork(1) download
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <ctime>
  5. #include <cstdint>
  6.  
  7. #pragma GCC optimize("O2")
  8. //#pragma GCC target("sse2")
  9.  
  10. constexpr unsigned int N=16*1024;
  11.  
  12. float in[N];
  13. int16_t out[N];
  14.  
  15. //==============================================================================
  16.  
  17. void f0(const float *src,int16_t *dst,unsigned int numSamples)
  18. {
  19. for(unsigned int i=0; i<numSamples; i++)
  20. {
  21. *dst=(int16_t)(*src * 32767);
  22. dst++; src++;
  23. }
  24. }
  25.  
  26. void f1(const float *src,int16_t *dst,unsigned int numSamples)
  27. {
  28. for(unsigned int i=0; i<numSamples; i++)
  29. {
  30. float t=*src+384.0f;
  31. memcpy(dst,&t,2);
  32. dst++; src++;
  33. }
  34. }
  35.  
  36. //==============================================================================
  37.  
  38. void run(int i)
  39. {
  40. switch(i)
  41. {
  42. case 1:
  43. f1(in,out,N);
  44. break;
  45. default:
  46. f0(in,out,N);
  47. }
  48. for(unsigned int i=0;i<N;i+=2500)
  49. printf("out[%d]=%d\n",i,int(out[i]));
  50. }
  51.  
  52. //==============================================================================
  53.  
  54. float get_time()
  55. {
  56. return float(clock())/float(CLOCKS_PER_SEC);
  57. }
  58.  
  59. float test(int i)
  60. {
  61. float t=get_time();
  62. run(i);
  63. t=get_time()-t;
  64. printf("%.1f ns/sample\n",1.0e+9f*t/float(N));
  65. }
  66.  
  67. void init()
  68. {
  69. for(unsigned int i=0;i<N;++i)
  70. {
  71. float t=float(rand())/float(RAND_MAX);
  72. in[i]=2.0f*t-1.0f;
  73. }
  74. }
  75.  
  76. //==============================================================================
  77.  
  78. int main()
  79. {
  80. init();
  81. test(0);
  82. test(1);
  83. return 0;
  84. }
Success #stdin #stdout 0s 3236KB
stdin
Standard input is empty
stdout
out[0]=22293
out[2500]=2503
out[5000]=-11638
out[7500]=7931
out[10000]=-30049
out[12500]=17940
out[15000]=-7729
13.0 ns/sample
out[0]=22295
out[2500]=2504
out[5000]=-11639
out[7500]=7932
out[10000]=-30050
out[12500]=17941
out[15000]=-7730
2.4 ns/sample