Автор Гілка: Індуський код  (Прочитано 3586 раз)

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Індуський код
« : 2012-09-28 19:10:13 »
Опис експерименту:
компілятор: gcc (GCC) 4.6.3 20120306 (Red Hat 4.6.3-2)
прапорець оптимізації: -O2

Шматочок експериментального коду:
#if 1
      j = ((symp.atom[0] == central) || j);
      j = ((symp.atom[1] == central) || j);
      j = ((symp.atom[2] == central) || j);
      j = ((symp.atom[3] == central) || j);
      if (j)
      g_array_append_vals (symps, &symp, 1);
#else
      for (j = 0; j < 4; j++)
      if (symp.atom[j] == central)
        {
          g_array_append_vals (symps, &symp, 1);
          break;
        }
#endif
Код знаходиться в робочій програмі тому результати експерименту можуть бути дещо спотворені побічними процесами.
коли #if 1:
real      0m12.537s
user      0m11.982s
sys      0m0.037s
коли #if 0:
real      0m24.610s
user      0m23.785s
sys      0m0.033s

Таки правду сказали в http://lurkmore.to/%D0%98%D0%BD%D0%B4%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9_%D0%BA%D0%BE%D0%B4  - завдяки китайському коду програма прискорюється.
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

Відсутній Михайло Даниленко

  • Адміністратор ЩОДО
  • Літератор
  • *****
  • дописів: 1262
  • Карма: +0/-0
  • [Debian Stretch]
Re: Індуський код
« Відповідей #1 : 2012-09-28 19:19:04 »
Звичайне розгортання циклів. Можливо з -O3 компілятор це сам зробить.
До речі, правильніше буде j = (j || (symp.atom
  • == central) ); — так якщо 0 центральний, інші не будуть тестуватися.

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Re: Індуський код
« Відповідей #2 : 2012-09-28 20:01:47 »
j ініціалізувалось як int j = 0;
в більшості випадків j так нулем і залишається.
хоча... чого вартує мені спробувати...
real      0m20.795s
user      0m15.573s
sys      0m0.048s
дзуськи  ;D
Edit:
Тепер там таки код:
 for (i = 0; i < N; i++)
    {
      int j = 0;
      SYMPLEX symp = g_array_index (csn->Symplexes, SYMPLEX, i);
#if 1
      j = symp.atom[0] == central || j;
      j = symp.atom[1] == central || j;
      j = symp.atom[2] == central || j;
      j = symp.atom[3] == central || j;
      if (j)
      g_array_append_vals (symps, &symp, 1);
#else
      for (j = 0; j < 4; j++)
      if (symp.atom[j] == central)
        {
          g_array_append_vals (symps, &symp, 1);
          break;
        }
#endif
    }
« Змінено: 2012-09-28 20:09:10 від serg_ik »
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.

r00t x

  • Гість
Re: Індуський код
« Відповідей #3 : 2012-09-28 23:29:56 »
Із лолумора:
RANDOM = (rand() + rand() + rand()) / 3;
Навіть мені зрозуміло :)

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3742
  • Карма: +9/-0
  • Програміст
Re: Індуський код
« Відповідей #4 : 2012-10-01 15:58:27 »
(rand() + rand() + rand()) / 3  — це дешевий спосіб отримати Гаусовий розподіл з рівномірного на проміжку від 0 до 1.
« Змінено: 2012-10-01 15:59:43 від lvm »
[Fedora Linux]

Відсутній Сергій Лисовенко

  • Літератор
  • ******
  • дописів: 1489
  • Карма: +0/-0
Re: Індуський код
« Відповідей #5 : 2012-10-01 22:04:09 »
Тобто просто деякі кодочитаки просто не зрозуміли справжніх намірів програміста і охрестили цей шматок "китайським кодом"...
Якщо Лінукс написали студенти - нехай вони під ним і навчаються.