main.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #include <benchmark/benchmark.h>
  2. #include "test_common.h"
  3. extern "C" {
  4. #include "PikaMain.h"
  5. #include "PikaParser.h"
  6. #include "PikaStdLib_MemChecker.h"
  7. #include "PikaVM.h"
  8. #include "dataArgs.h"
  9. #include "dataMemory.h"
  10. #include "dataStrs.h"
  11. #include "pikaScript.h"
  12. }
  13. static void for_loop_10000(benchmark::State& state) {
  14. for (auto _ : state) {
  15. PikaObj* pikaMain = newRootObj((char*)"pikaMain", New_PikaMain);
  16. /* run */
  17. pikaVM_run(pikaMain, (char *)
  18. "a = 0\n"
  19. "for i in range(0, 10000):\n"
  20. " a = a + 1\n"
  21. "\n");
  22. obj_deinit(pikaMain);
  23. }
  24. }
  25. BENCHMARK(for_loop_10000)->Unit(benchmark::kMillisecond);
  26. static void while_loop_10000(benchmark::State& state) {
  27. for (auto _ : state) {
  28. PikaObj* pikaMain = newRootObj((char*)"pikaMain", New_PikaMain);
  29. /* run */
  30. pikaVM_run(pikaMain, (char *)
  31. "i = 0\n"
  32. "while i < 10000:\n"
  33. " i = i + 1\n"
  34. "\n");
  35. obj_deinit(pikaMain);
  36. }
  37. }
  38. BENCHMARK(while_loop_10000)->Unit(benchmark::kMillisecond);
  39. void __platform_printf(char* fmt, ...) {}
  40. static void for_print_1000(benchmark::State& state) {
  41. Args* buffs = New_strBuff();
  42. char* pikaAsm = pika_lines2Asm(buffs, (char*)
  43. "for i in range(1000):\n"
  44. " print(i)\n"
  45. "\n");
  46. ByteCodeFrame bytecode_frame;
  47. byteCodeFrame_init(&bytecode_frame);
  48. byteCodeFrame_appendFromAsm(&bytecode_frame, pikaAsm);
  49. for (auto _ : state) {
  50. PikaObj* pikaMain = newRootObj((char*)"pikaMain", New_PikaMain);
  51. /* run */
  52. pikaVM_runByteCodeFrame(pikaMain, &bytecode_frame);
  53. obj_deinit(pikaMain);
  54. }
  55. byteCodeFrame_deinit(&bytecode_frame);
  56. args_deinit(buffs);
  57. }
  58. BENCHMARK(for_print_1000)->Unit(benchmark::kMillisecond);
  59. static void prime_number_100(benchmark::State& state) {
  60. int num = 0;
  61. Args* buffs = New_strBuff();
  62. char* pikaAsm = pika_lines2Asm(buffs, (char*)
  63. "num = 0\n"
  64. "i = 2\n"
  65. "while i < 100:\n"
  66. " is_prime = 1\n"
  67. " j = 2\n"
  68. " while j < i:\n"
  69. " if i%j==0 :\n"
  70. " is_prime = 0\n"
  71. " break\n"
  72. " j += 1 \n"
  73. " if is_prime:\n"
  74. " num = num + i\n"
  75. " i += 1\n"
  76. "\n");
  77. ByteCodeFrame bytecode_frame;
  78. byteCodeFrame_init(&bytecode_frame);
  79. byteCodeFrame_appendFromAsm(&bytecode_frame, pikaAsm);
  80. for (auto _ : state) {
  81. PikaObj* pikaMain = newRootObj((char*)"pikaMain", New_PikaMain);
  82. /* run */
  83. pikaVM_runByteCodeFrame(pikaMain, &bytecode_frame);
  84. num = obj_getInt(pikaMain, (char*)"num");
  85. if (1060 != num) {
  86. printf("Error: prime_number_100\r\n");
  87. }
  88. obj_deinit(pikaMain);
  89. }
  90. byteCodeFrame_deinit(&bytecode_frame);
  91. args_deinit(buffs);
  92. }
  93. BENCHMARK(prime_number_100)->Unit(benchmark::kMillisecond);
  94. static void prime_number_100_c(benchmark::State& state) {
  95. int num = 0;
  96. for (auto _ : state) {
  97. num = 0;
  98. /* run */
  99. for (int i = 2; i < 100; i++) {
  100. int is_prime = 1;
  101. for (int j = 2; j < i; j++) {
  102. if (i % j == 0) {
  103. is_prime = 0;
  104. break;
  105. }
  106. }
  107. if (is_prime) {
  108. num = num + i;
  109. }
  110. }
  111. if (1060 != num) {
  112. printf("Error: prime_number_100\r\n");
  113. }
  114. }
  115. }
  116. BENCHMARK(prime_number_100_c)->Unit(benchmark::kMillisecond);
  117. BENCHMARK_MAIN();