testCopy.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:7k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <ndb_global.h>
  14. #include <NdbOut.hpp>
  15. #include <NdbTick.h>
  16. #ifdef __NDB_FORTE6
  17. #define HAND
  18. bool hand = true;
  19. #else
  20. bool hand = false;
  21. #endif 
  22. struct Data7 {
  23.   Uint32 data[7];
  24. #ifdef HAND
  25.   inline Data7& operator=(const Data7 & o){
  26.     Uint32 t0 = o.data[0];
  27.     Uint32 t1 = o.data[1];
  28.     Uint32 t2 = o.data[2];
  29.     Uint32 t3 = o.data[3];
  30.     Uint32 t4 = o.data[4];
  31.     Uint32 t5 = o.data[5];
  32.     Uint32 t6 = o.data[6];
  33.     data[0] = t0;
  34.     data[1] = t1;
  35.     data[2] = t2;
  36.     data[3] = t3;
  37.     data[4] = t4;
  38.     data[5] = t5;
  39.     data[6] = t6;
  40.     return * this;
  41.   }
  42. #endif
  43. };
  44. struct Data25 {
  45.   Uint32 data[25];
  46. };
  47. struct TestSignal {
  48.   
  49.   Data7  head;
  50.   Data25 data;
  51. };
  52. Uint32 g_time = 3000;
  53. Uint32 g_count = 8*2048;
  54. TestSignal g_signal;
  55. TestSignal * g_jobBuffer;
  56. template<Uint32 LEN>
  57. inline
  58. void
  59. MEMCOPY(Uint32 * to, const Uint32 * from){
  60.   Uint32 t0 ;
  61.   Uint32 t1 ;
  62.   Uint32 t2 ;
  63.   Uint32 t3 ;
  64.   Uint32 len = LEN;
  65.   while(len > 4){
  66.     t0 = from[0];
  67.     t1 = from[1];
  68.     t2 = from[2];
  69.     t3 = from[3];
  70.     
  71.     to[0] = t0;
  72.     to[1] = t1;
  73.     to[2] = t2;
  74.     to[3] = t3;
  75.     
  76.     to += 4;
  77.     from += 4;
  78.     len -= 4;
  79.   }
  80.   
  81.   //ndbout_c("len = %d", len);
  82.   t0 = from[0];
  83.   t1 = from[1];
  84.   t2 = from[2];
  85.   switch(len & 3){
  86.   case 3:
  87.     //ndbout_c("3");
  88.     to[2] = t2;
  89.   case 2:
  90.     //ndbout_c("2");
  91.     to[1] = t1;
  92.   case 1:
  93.     //ndbout_c("1");
  94.     to[0] = t0;
  95.   }
  96.   
  97. }
  98. inline
  99. void
  100. MEMCOPY_NO_WORDS(Uint32 * to, const Uint32 * from, Uint32 len){
  101.   Uint32 t0 ;
  102.   Uint32 t1 ;
  103.   Uint32 t2 ;
  104.   Uint32 t3 ;
  105.   while(len > 4){
  106.     t0 = from[0];
  107.     t1 = from[1];
  108.     t2 = from[2];
  109.     t3 = from[3];
  110.     
  111.     to[0] = t0;
  112.     to[1] = t1;
  113.     to[2] = t2;
  114.     to[3] = t3;
  115.     
  116.     to += 4;
  117.     from += 4;
  118.     len -= 4;
  119.   }
  120.   
  121.   //ndbout_c("len = %d", len);
  122.   t0 = from[0];
  123.   t1 = from[1];
  124.   t2 = from[2];
  125.   switch(len & 3){
  126.   case 3:
  127.     //ndbout_c("3");
  128.     to[2] = t2;
  129.   case 2:
  130.     //ndbout_c("2");
  131.     to[1] = t1;
  132.   case 1:
  133.     //ndbout_c("1");
  134.     to[0] = t0;
  135.   }
  136. }
  137. inline
  138. void 
  139. copy1(Uint32 i, TestSignal & ts){
  140.   TestSignal & dst = g_jobBuffer[i];
  141.   Uint32 t0 = ts.head.data[0];
  142.   Uint32 t1 = ts.head.data[1];
  143.   Uint32 t2 = ts.head.data[2];
  144.   Uint32 t3 = ts.head.data[3];
  145.   Uint32 t4 = ts.head.data[4];
  146.   Uint32 t5 = ts.head.data[5];
  147.   Uint32 t6 = ts.head.data[6];
  148.   dst.head.data[0] = t0;
  149.   dst.head.data[1] = t1;
  150.   dst.head.data[2] = t2;
  151.   dst.head.data[3] = t3;
  152.   dst.head.data[4] = t4;
  153.   dst.head.data[5] = t5;
  154.   dst.head.data[6] = t6;
  155. inline
  156. void 
  157. copy2(Uint32 i, TestSignal & ts){
  158.   TestSignal & dst = g_jobBuffer[i];
  159.   Uint32 t0 = ts.head.data[0];
  160.   Uint32 t1 = ts.head.data[1];
  161.   Uint32 t2 = ts.head.data[2];
  162.   Uint32 t3 = ts.head.data[3];
  163.   dst.head.data[0] = t0;
  164.   dst.head.data[1] = t1;
  165.   dst.head.data[2] = t2;
  166.   dst.head.data[3] = t3;
  167.   Uint32 t4 = ts.head.data[4];
  168.   Uint32 t5 = ts.head.data[5];
  169.   Uint32 t6 = ts.head.data[6];
  170.   dst.head.data[4] = t4;
  171.   dst.head.data[5] = t5;
  172.   dst.head.data[6] = t6;
  173. inline
  174. void
  175. copy3(Uint32 i, TestSignal & ts){
  176.   TestSignal & dst = g_jobBuffer[i];
  177.   dst.head = ts.head;
  178. }
  179. inline
  180. void
  181. copy4(Uint32 i, TestSignal & ts){
  182.   TestSignal & dst = g_jobBuffer[i];
  183.   memcpy(&dst.head.data[0], &ts.head.data[0], sizeof(Data7));
  184. }
  185. inline
  186. void
  187. copy5(Uint32 i, TestSignal & ts){
  188.   TestSignal & dst = g_jobBuffer[i];
  189.   MEMCOPY_NO_WORDS(&dst.head.data[0], &ts.head.data[0], 7);
  190. }
  191. inline
  192. void
  193. copy6(Uint32 i, TestSignal & ts){
  194.   TestSignal & dst = g_jobBuffer[i];
  195.   MEMCOPY<7>(&dst.head.data[0], &ts.head.data[0]);
  196. }
  197. inline
  198. void
  199. copy7(Uint32 i, TestSignal & ts){
  200.   TestSignal & dst = g_jobBuffer[i];
  201. #if (__GNUC__ >= 3 ) || (__GNUC__ == 2 && __GNUC_MINOR >= 95)
  202.   __builtin_memcpy(&dst.head.data[0], &ts.head.data[0], sizeof(Data7));
  203. #else
  204.   dst.head = ts.head;
  205. #endif
  206. }
  207. template<void (* C)(Uint32 i, TestSignal & ts)>
  208. int 
  209. doTime(Uint32 ms){
  210.   
  211.   Uint64 ms1, ms2;
  212.   const Uint32 count = g_count;
  213.   for(Uint32 i = 0; i<count; i++)
  214.     C(i, g_signal);
  215.   for(Uint32 i = 0; i<count; i++)
  216.     C(i, g_signal);
  217.   
  218.   Uint32 laps = 0;
  219.   
  220.   ms1 = NdbTick_CurrentMillisecond();
  221.   do {
  222.     for(int j = 100; j>= 0; j--)
  223.       for(Uint32 i = 0; i<count; i++){
  224. C(i, g_signal);
  225.       }
  226.     ms2 = NdbTick_CurrentMillisecond();
  227.     laps += 100;
  228.   } while((ms2 - ms1) < ms);
  229.   
  230.   return laps;
  231. }
  232. template<void (* C)(Uint32 i, TestSignal & ts)>
  233. void doCopyLap(Uint32 laps, const char * title){
  234.   Uint64 ms1, ms2;
  235.   const Uint32 count = g_count;
  236.   for(Uint32 i = 0; i<count; i++)
  237.     C(i, g_signal);
  238.   laps--;
  239.   for(Uint32 i = 0; i<count; i++)
  240.     C(i, g_signal);
  241.   laps--;
  242.   
  243.   Uint32 div = laps;
  244.   
  245.   ms1 = NdbTick_CurrentMillisecond();
  246.   while(laps > 0){
  247.     for(Uint32 i = 0; i<count; i++){
  248. #if (__GNUC__ == 3 && __GNUC_MINOR >= 1)
  249.       _builtin_prefetch(&g_jobBuffer[i], 1, 0);
  250. #endif
  251.       C(i, g_signal);
  252.     }
  253.     laps--;
  254.   }
  255.   ms2 = NdbTick_CurrentMillisecond();
  256.   
  257.   ms2 -= ms1;
  258.   Uint32 diff = ms2;
  259.   ndbout_c("%s : %d laps in %d millis => %d copies/sec",
  260.    title, div, diff, (1000*div*g_count+(diff/2))/diff);
  261. }
  262. int
  263. main(int argc, const char ** argv){
  264.   
  265.   if(argc > 1)
  266.     g_count = atoi(argv[1]);
  267.   if(argc > 2)
  268.     g_time = atoi(argv[2]);
  269.   
  270.   ndbout_c("Using %d entries => %d kB ", 
  271.    g_count,
  272.    g_count * sizeof(TestSignal) / 1024);
  273.   ndbout_c("Testing for %d ms", g_time);
  274.   ndbout_c("Using %s copy-constructor", 
  275.    (hand ? "hand written" : "compiler generated")); 
  276.   
  277.   g_jobBuffer = new TestSignal[g_count + 1];
  278.   for(int i = 0; i<10; i++)
  279.     memset(g_jobBuffer, 0, g_count * sizeof(TestSignal));
  280.   int laps = doTime<copy2>(g_time);
  281.   ndbout_c("Laps = %d", laps);
  282.   doCopyLap<copy2>(laps, "4 t-variables");
  283.   doCopyLap<copy3>(laps, "copy constr. ");
  284.   doCopyLap<copy1>(laps, "7 t-variables");
  285.   doCopyLap<copy4>(laps, "mem copy     ");
  286.   doCopyLap<copy5>(laps, "mem copy hand");
  287.   doCopyLap<copy6>(laps, "mem copy temp");
  288.   doCopyLap<copy7>(laps, "mem copy gcc ");
  289.   delete[] g_jobBuffer;
  290.   return 0;
  291. }