fork(1) download
  1. #include <stdio.h>
  2. #include <time.h>
  3.  
  4. clock_t t;
  5.  
  6. void tic() {
  7. t = clock();
  8. }
  9.  
  10. void toc() {
  11. printf("%d\n", clock() - t );
  12. }
  13.  
  14.  
  15. //это то, что делается при мономорфизации - типы можно передавать по значению
  16. //код может инлайниться, а может и нет
  17. void __attribute__ ((noinline)) shablonnoe_petushenie(int a, int b, int* c) {
  18. *c = a + b;
  19. }
  20.  
  21. // а вот это - трушный параметрический полиморфизм
  22. // который можно и в dll запихнуть, например, т.е. неплохая штука для построения
  23. // плагинов. Все лежит в коробке
  24. typedef struct Dict_tag {
  25. void (*add)(void*a, void* b, void* c);
  26. } Dict;
  27.  
  28. void __attribute__ ((noinline)) bozhestvenniy_slovar(int* a, int* b, int* c) {
  29. *c = *a + *b;
  30. }
  31.  
  32. Dict intdict = { .add = &bozhestvenniy_slovar };
  33.  
  34.  
  35. // код
  36.  
  37. int main() {
  38. int SIZE = 100000000;
  39.  
  40. int* yoba = malloc(SIZE * sizeof(int));
  41.  
  42. for (int i = 0; i < SIZE; ++i) {
  43. yoba[i] = i;
  44. }
  45.  
  46. tic();
  47. int sum1 = 0;
  48. for (int i = 0; i < SIZE; ++i) {
  49. intdict.add(&sum1, &yoba[i], &sum1);
  50. }
  51. toc();
  52. printf("%d\n", sum1);
  53.  
  54. tic();
  55. int sum2 = 0;
  56. for (int i = 0; i < SIZE; ++i) {
  57. shablonnoe_petushenie(sum2, yoba[i], &sum2);
  58. }
  59. toc();
  60. printf("%d\n", sum2);
  61.  
  62.  
  63.  
  64. free(yoba);
  65. return 0;
  66. }
Success #stdin #stdout 1.49s 2112KB
stdin
Standard input is empty
stdout
555742
887459712
510672
887459712