|
Периодические задержки при выполнении программы
|
|||
---|---|---|---|
#18+
Выполняю задачу, требуется произвести вычисления, настолько быстро, насколько это позволяют ресурсы системы, пусть даже в ущерб всем остальным процессам. При анализе производительности обратил внимание на следующую особенность. Как правило участки кода выполняются за более-менее одинаковое время, однако, периодически происходят непонятные мне задержки, достаточно длительные. Я попытался сделать упрощенную модель программы, чтобы показать, то, что я имею в виду. В программе итеративный процесс, на каждой итерации длинный внутренний цикл, имитирующий вычисления. Далее, на каждом цикле запоминаем время окончания вычисления. После этого находим продолжительность каждой итерации. Находим среднее время итерации. После чего ищем итерации, продолжительность которых более чем в три раза выше средней и выводим их. Если посмотреть на продолжительность итераций, то в большинстве случаев они практически одинаковые (порядка 70 мкс в моем случае).Но есть итерации,которые более чем в 8 раз больше среднего. Следует отметить также, что процессор во время выполнения программы загружается где-то процентов на 13%. Т.е. свободных ресурсов процессора - "выше крыши", процессор используется неэффективно, и программа может быть выполнена гораздо быстрее.Пробовал увеличивать приоритет процесса и потока до максимальных - эффекта практически нет. Вопросы: 1. Из-за чего происходят большие периодические задержки в выполнении программы, и как от них избавится ? 2. Почему процессорное время используется неэффективно, как задействовать все ресурсы процессора для выполнения программы ? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2015, 09:52 |
|
Периодические задержки при выполнении программы
|
|||
---|---|---|---|
#18+
constant_ural, ну... можно вспомнить о том кто занимается выделением процессорного времени задаче... и на что оно собственно тратится... эффективность больше связана с написанием выбором опитмальных алгоритмов, распараллеливанием вычислений... ну и еще можно поиграть с приоритетами и пр... а загрузить камень на 100% хм... это не задача... В любом случае - ваш пример более чем не показателен... Вот кусок старинного говнокода... попробуйте... Или подождите гур, что зубы на этом деле съели... они вам чакры и откроют... Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2015, 11:51 |
|
Периодические задержки при выполнении программы
|
|||
---|---|---|---|
#18+
ИМХУ это оптимизатор вообще выкинул при компиляции: constant_ural Код: c# 1. 2.
Компилируй в дебаг или напиши что-нибудь осознанное с сохранением результата. Например посчитай сумму произведений i*j и результат в массив сохраняй. Листы на массивы замени, чтобы скорость выделения памяти не мерить. У процессора твоего сколько ядер? У тебя расчет в один поток, т.е. максимум одно ядро загрузишь. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2015, 12:01 |
|
Периодические задержки при выполнении программы
|
|||
---|---|---|---|
#18+
В конце расчета вот это еще посмотри Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2015, 12:42 |
|
Периодические задержки при выполнении программы
|
|||
---|---|---|---|
#18+
Немного изменил алгоритм по советам отвечающих: 1. Убрал листы, добавил жесткие массивы 2. Сделал максимально возможный приоритет для процесса и для потока 3. Вывел количество сборок мусора в конце Листинг ниже. Выводы: 1. Среднее время выполнения итерации такое же, особо ничего не изменилось, немного уменьшилось количество отклонений от среднего, но не на много 2. Сборщик мусора похоже здесь не причем. До изменений был вывод 1/1/1 после изменений 0/0/0 Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2015, 14:19 |
|
Периодические задержки при выполнении программы
|
|||
---|---|---|---|
#18+
Это забыл Dima TИМХУ это оптимизатор вообще выкинул при компиляции: constant_ural Код: c# 1. 2.
Компилируй в дебаг или напиши что-нибудь осознанное с сохранением результата. Например посчитай сумму произведений i*j и результат в массив сохраняй. Если у тебя итерации продолжительные, то эмулируй их. чтобы одна итерация была хотя бы 0.1 сек. Замер в микросекундах это ни о чем. Разница на порядок может быть из-за погрешностей измерения. Как-то так Код: c# 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2015, 14:32 |
|
Периодические задержки при выполнении программы
|
|||
---|---|---|---|
#18+
Кстати на чем меряешь? Если на ноуте - то имей ввиду, что там проц чуть помолотил, нагрелся и затупил, подостыл - опять замолотил. По моим наблюдениям только десктопные процы честно молотят в соответствии с заявленными гигагерцами. Могу ошибаться, не так уж и много я их тестил. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2015, 14:50 |
|
Периодические задержки при выполнении программы
|
|||
---|---|---|---|
#18+
В Windows же все процессы и потоки сбалансированы и если System начнет, что то выполнять с высоким приоритетом, твоя программа подождет ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2015, 16:39 |
|
Периодические задержки при выполнении программы
|
|||
---|---|---|---|
#18+
авторВ Windows же все процессы и потоки сбалансированы и если System начнет, что то выполнять с высоким приоритетом, твоя программа подождет Но ведь я же в последней версии тестовой программы увеличил приоритет процесса и исполняемого потока, или это не столь важно ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2015, 20:53 |
|
Периодические задержки при выполнении программы
|
|||
---|---|---|---|
#18+
constant_uralавторВ Windows же все процессы и потоки сбалансированы и если System начнет, что то выполнять с высоким приоритетом, твоя программа подождет Но ведь я же в последней версии тестовой программы увеличил приоритет процесса и исполняемого потока, или это не столь важно ? Не важно. Виндовс не реал-тайм ОС. У тебя задача какая? Замеры замерить или что-то более полезное? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2015, 21:08 |
|
Периодические задержки при выполнении программы
|
|||
---|---|---|---|
#18+
авторНе важно. Виндовс не реал-тайм ОС. У тебя задача какая? Замеры замерить или что-то более полезное Скажем так, производить обработку данных. Просто иногда (редко) эти данные поступают от сервера очень быстро, и происходит "затык", а обработать их надо не так чтобы хард реал тайм но более менее без задержек. Вот я пытаюсь выяснить узкие места при работе с дотнетом в сходных условиях. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2015, 21:12 |
|
Периодические задержки при выполнении программы
|
|||
---|---|---|---|
#18+
constant_uralавторНе важно. Виндовс не реал-тайм ОС. У тебя задача какая? Замеры замерить или что-то более полезное Скажем так, производить обработку данных. Просто иногда (редко) эти данные поступают от сервера очень быстро, и происходит "затык", а обработать их надо не так чтобы хард реал тайм но более менее без задержек. Вот я пытаюсь выяснить узкие места при работе с дотнетом в сходных условиях. В этой ситуации данные надо кэшировать. Делай максимально быстрое кэширование. Т.е. нужна очень быстрая постановка в очередь на обработку. И обработку распараллеливай по возможности. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2015, 21:53 |
|
Периодические задержки при выполнении программы
|
|||
---|---|---|---|
#18+
GC какбэ может приоcтанавливать работу программы. Поэтому если скорость так критичная, что счет идет на микросекунды, .Net не самый удачный выбор Прочитайте про отключение сборки мусора для критичных участков кода GCLatencyMode GC.TryStartNoGCRegion ... |
|||
:
Нравится:
Не нравится:
|
|||
22.12.2015, 14:45 |
|
|
start [/forum/topic.php?fid=20&fpage=70&tid=1400948]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 141ms |
0 / 0 |