Guest User

Untitled

a guest
Jul 16th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.15 KB | None | 0 0
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3.  
  4. typedef unsigned __int64 uint64;
  5.  
  6. static inline uint64 tick()
  7. {
  8. uint64 d;
  9. __asm__ __volatile__ ("rdtsc" : "=A" (d) );
  10. return d;
  11. }
  12.  
  13. template<class T> class TemplatedBigN
  14. {
  15. public:
  16. TemplatedBigN() {size = sizeof(T);};
  17. uint64 forward()
  18. {
  19. char temp;
  20. uint64 time = tick();
  21. for(uint64 i=0; i <size;++i)
  22. {
  23. temp = data[i];
  24. dummy(temp);
  25. }
  26. return tick() - time;
  27. };
  28. uint64 random()
  29. {
  30. char temp;
  31. uint64 time = tick();
  32. qsrand(time);
  33. for(uint64 i=0; i <size;++i)
  34. {
  35. temp = data[qrand()%size];
  36. dummy(temp);
  37. }
  38. return tick() - time;
  39. };
  40. private:
  41. unsigned int size;
  42. T data;
  43.  
  44. void dummy(char d) {d;};
  45. };
  46.  
  47. class BigN
  48. {
  49. public:
  50. BigN(uint64 size) { data = new char[size]; this->size = size;};
  51. ~BigN() { delete data;};
  52. uint64 forward()
  53. {
  54. char temp;
  55. uint64 time = tick();
  56. for(uint64 i=0; i <size;++i)
  57. {
  58. temp = data[i];
  59. dummy(temp);
  60. }
  61. return tick() - time;
  62. };
  63. uint64 random()
  64. {
  65. char temp;
  66. uint64 time = tick();
  67. qsrand(time);
  68. for(uint64 i=0; i <size;++i)
  69. {
  70. temp = data[qrand()%size];
  71. dummy(temp);
  72. }
  73. return tick() - time;
  74. };
  75. private:
  76. uint64 size;
  77. char *data;
  78. void dummy(char d) {d;};
  79. };
  80.  
  81.  
  82. // MainWindow code
  83. MainWindow::MainWindow(QWidget *parent) :
  84. QMainWindow(parent),
  85. ui(new Ui::MainWindow)
  86. {
  87. ui->setupUi(this);
  88.  
  89. }
  90.  
  91. MainWindow::~MainWindow()
  92. {
  93. delete ui;
  94. }
  95.  
  96. void MainWindow::on_pbGo_clicked()
  97. {
  98. uint64 bnct, tbnct, bnat=0, tbnat=0;
  99. log("Run random test at 64 byte size and 100000 steps");
  100. QApplication::processEvents();
  101. int steps=100000;
  102. {
  103. BigN bn(64);
  104. TemplatedBigN<unsigned char[64]> tbn;
  105. for(int i=0;i<steps;++i)
  106. {
  107. bnct = bn.random();
  108. QApplication::processEvents();
  109. tbnct =tbn.random();
  110. bnat+=bnct; tbnat+=tbnct;
  111. }
  112. bnat/=steps;
  113. tbnat/=steps;
  114. }
  115. log("TemplatedBigN avg clocks: " + QString::number(tbnat));
  116. log("BigN avg clocks: " + QString::number(bnat));
  117.  
  118. log("Run random test at 256 byte size and 100000 steps");
  119. QApplication::processEvents();
  120. {
  121. BigN bn(256);
  122. TemplatedBigN<unsigned char[256]> tbn;
  123. for(int i=0;i<steps;++i)
  124. {
  125. bnct = bn.random();
  126. QApplication::processEvents();
  127. tbnct =tbn.random();
  128. bnat+=bnct; tbnat+=tbnct;
  129. }
  130. bnat/=steps;
  131. tbnat/=steps;
  132. }
  133. log("TemplatedBigN avg clocks: " + QString::number(tbnat));
  134. log("BigN avg clocks: " + QString::number(bnat));
  135.  
  136. log("Run random test at 1024 byte size and 100000 steps");
  137. QApplication::processEvents();
  138. {
  139. BigN bn(1024);
  140. TemplatedBigN<unsigned char[1024]> tbn;
  141. for(int i=0;i<steps;++i)
  142. {
  143. bnct = bn.random();
  144. QApplication::processEvents();
  145. tbnct =tbn.random();
  146. bnat+=bnct; tbnat+=tbnct;
  147. }
  148. bnat/=steps;
  149. tbnat/=steps;
  150. }
  151. log("TemplatedBigN avg clocks: " + QString::number(tbnat));
  152. log("BigN avg clocks: " + QString::number(bnat));
  153.  
  154. log("Run random test at 1 048 576 byte size and 1000 steps");
  155. steps = 1000;
  156. QApplication::processEvents();
  157. {
  158. BigN bn(1048576);
  159. TemplatedBigN<unsigned char[1048576]> tbn;
  160. for(int i=0;i<steps;++i)
  161. {
  162. bnct = bn.random();
  163. QApplication::processEvents();
  164. tbnct = tbn.random();
  165. bnat+=bnct; tbnat+=tbnct;
  166. }
  167. bnat/=steps;
  168. tbnat/=steps;
  169. }
  170. log("TemplatedBigN avg clocks: " + QString::number(tbnat));
  171. log("BigN avg clocks: " + QString::number(bnat));
  172. }
  173.  
  174. void MainWindow::log(const QString &msg)
  175. {
  176. ui->teLog->insertPlainText(msg+"\n");
  177. }
Add Comment
Please, Sign In to add comment