Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

83 рядки
2.3 KiB

  1. //
  2. // Lol Engine — Benchmark program
  3. //
  4. // Copyright © 2005—2018 Sam Hocevar <sam@hocevar.net>
  5. //
  6. // This program is free software. It comes without any warranty, to
  7. // the extent permitted by applicable law. You can redistribute it
  8. // and/or modify it under the terms of the Do What the Fuck You Want
  9. // to Public License, Version 2, as published by the WTFPL Task Force.
  10. // See http://www.wtfpl.net/ for more details.
  11. //
  12. #if HAVE_CONFIG_H
  13. # include "config.h"
  14. #endif
  15. #include <cstdio>
  16. #include <lol/engine.h>
  17. using namespace lol;
  18. static size_t const REAL_TABLE_SIZE = 10000;
  19. static size_t const REAL_RUNS = 50;
  20. void bench_real(int mode)
  21. {
  22. float result[12] = { 0.0f };
  23. lol::timer timer;
  24. for (size_t run = 0; run < REAL_RUNS; run++)
  25. {
  26. switch (mode)
  27. {
  28. case 1:
  29. break;
  30. }
  31. real fib1 = 1.0, fib2 = 1.0;
  32. timer.get();
  33. for (size_t i = 0; i < REAL_TABLE_SIZE; i++)
  34. {
  35. real tmp = fib1 + fib2;
  36. fib1 = fib2;
  37. fib2 = tmp;
  38. }
  39. result[0] += timer.get();
  40. real fact = 1.0;
  41. timer.get();
  42. for (size_t i = 0; i < REAL_TABLE_SIZE; i++)
  43. fact = fact * real(1.0 + i);
  44. result[1] += timer.get();
  45. real invfact = 1.0;
  46. timer.get();
  47. for (size_t i = 0; i < REAL_TABLE_SIZE; i++)
  48. invfact = invfact / real(1.0 + i);
  49. result[2] += timer.get();
  50. timer.get();
  51. for (size_t i = 0; i < REAL_TABLE_SIZE / 128; i++)
  52. (void)sin(real(0.01 * i));
  53. result[3] += timer.get() * 128;
  54. timer.get();
  55. for (size_t i = 0; i < REAL_TABLE_SIZE / 128; i++)
  56. (void)exp((real)(int)(i - REAL_TABLE_SIZE / 256));
  57. result[4] += timer.get() * 128;
  58. }
  59. for (size_t i = 0; i < sizeof(result) / sizeof(*result); i++)
  60. result[i] *= 1e9f / (REAL_TABLE_SIZE * REAL_RUNS);
  61. msg::info(" ns/elem\n");
  62. msg::info("real = real + real %7.3f\n", result[0]);
  63. msg::info("real = real * real %7.3f\n", result[1]);
  64. msg::info("real = real / real %7.3f\n", result[2]);
  65. msg::info("real = sin(real) %7.3f\n", result[3]);
  66. msg::info("real = exp(real) %7.3f\n", result[4]);
  67. }