Страница 1 из 1

Как правильно считать время исполнения в программе на чистом Си

Добавлено: 2022-11-22 14:59:36
Demis
Есть некий код по ссылке https://github.com/hvds/divrep/blob/master/coul.c
Код автором изначально пишется на чистом Си в линуксе.

Под FreeBSD код нормально компилируется через gmake.

Проблема возникает на системах FreeBSD после длительного исполнения программы (примерно на 3-4-5 сутки непрерывной работы):

Код: Выделить всё

305 2^2 5 2.3^2 1783^2 2^5 3.7^2 2.5^2 . 2^2.3 11 2: 304070255 / 400706238 (1038534.88s)
305 2^2 5 2.3^2 1787^2 2^5 3.7^2 2.5^2 . 2^2.3 11 2: 207220755 / 398914373 (1039134.81s)
305 2^2 5 2.3^2 1789^2 2^5 3.7^2 2.5^2 . 2^2.3 11 2: 111454353 / 398022945 (1039734.71s)
305 2^2 5 2.3^2 1801^2 2^5 3.7^2 2.5^2 . 2^2.3 11 2: 15741483 / 392736589 (1039915.66s)
305 2^2 5 2.3^2 1801^2 2^5 3.7^2 2.5^2 . 2^2.3 11 2: 315552297 / 392736589 (1039915.66s)
305 2^2 5 2.3^2 1811^2 2^5 3.7^2 2.5^2 . 2^2.3 11 2: 226404572 / 388411330 (1039915.66s)
305 2^2 5 2.3^2 1823^2 2^5 3.7^2 2.5^2 . 2^2.3 11 2: 138234794 / 383314680 (1039915.66s)
305 2^2 5 2.3^2 1831^2 2^5 3.7^2 2.5^2 . 2^2.3 11 2: 55430952 / 379972443 (1039915.66s)
Как видим последний столбец перестает правильно вычисляться, происходит эффект "остановки подсчета времени".
Ссылка приведенная ниже показывает на участок кода и дана мне разработчиком.
https://github.com/hvds/divrep/blob/master/coul.c#L193

По его мнению в этом месте какая-то проблема, хотя на Линуксе таких проблем у него нет.
Известно, что компиляция через Cygwin для Виндовс нормально собирает программу.
И вроде тоже никто не жалуется на подобную проблему.
Похоже, что это проблема платформенная, т.е. конкретно на FreeBSD.

По моему мнению:
либо не совсем правильно вычисляется базис для отсчета времени работы программы,
либо принципиально не правильно производится подсчет времени работы программы,
либо еще что-то.

Изменения в код, по этой проблеме, разработчиком вносились уже не однократно.

Есть приамбула проблемы.
Первичные изменения для нормальной сборки под FreeBSD были сделаны:
https://github.com/hvds/divrep/commit/6 ... c7d55eba5d
Потом обнаружена проблема в том, что происходила заморозка вывода как на экран, так и в файл, при этом работа программы НЕ прекращалась.
И основной результат работы программы, в конце концов, записывался в файл и выводился на экран, хоть и с не верным временем.
Потом разработчик увеличил "разрядность/размер" переменной в два раза, программа стала работать в нормально, но только в два раза дольше "да момента заморозки".
Изменения здесь https://github.com/hvds/divrep/commit/0 ... f4108ea76d
После очередной длительной работы фриз повторился, на большей величине.
Снова разработчик переписал код приведя его к текущему значению https://github.com/hvds/divrep/blob/master/coul.c#L193

Я при этом не разработчик, язык Си не знаю, и нужных знаний у меня не хватает, да и корректно описать это по английски проблема для меня.
У меня есть последний ответ по этой проблеме от разработчика, но он пока не может понять, что происходит.

Можете подсказать направление поиска проблемы?
Или что, возможно, архитектурно не правильно в коде?

Как правильно считать время исполнения в программе на чистом Си

Добавлено: 2022-11-23 9:38:59
Demis
Все оказалось очень прозаично.
Проблема в коде ядра FreeBSD.
Проблема была заявлена в 2005 году.
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=76972
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=78957

Затрагивает все системы с 5.1RELEASE по (примерно) 12-ую...
Гуглим примерно так "FreeBSD getrusage ru_utime gets stuck after 381115 seconds".

Пофикшена только в 2019-ом:
https://bugs.freebsd.org/bugzilla/show_ ... =76972#c13

Хотя патчик прошел в рассылке еще в 2012-ом...
https://bz-attachments.freebsd.org/atta ... i?id=50537

Кто-ж знал, что этот вопрос для темы "FreeBSD"???
С приближающимся Вас! ...