Ви згадуєте профіль двомодального виконання, який ви бачите на
одній машині, а не на іншому. Це жахливо, але це нормально, навіть
для однопоточних програм.
Проблема в тому, що в системі Linux існує занадто багато
факторів (будь-який ядро, незалежно від використовуваного
планувальника), які впливають на продуктивність програми. Він
починається з адресно-рандомізації, і закінчується мікроскопічними
відмінностями часу, зростаючим до великих затримок перемикання
контексту між процесами.
Linux не є системою реального часу. Він просто намагається бути
максимально ефективним у середньому випадку.
Є кілька речей, які ви можете зробити, щоб мінімізувати
дисперсію ефективності:
Зменшити кількість ниток до мінімуму, необхідного. Не розбивайте
різні аспекти вашої проблеми на нитки. Просто поділіться на теми,
коли це дійсно необхідно, наприклад, для подання процесорів з
незалежними (!) Номерами хрускінгових завдань. Спробуйте зробити
якомога більше причинно пов'язаних робіт в одному потоці, наскільки
це можливо. Ви потоки повинні вимагати якнайменше спілкування один
з одним, наскільки це можливо. Зокрема, у вас не повинно бути
шаблонів запитів/відповідей між потоками, де затримки
складаються.
Припустимо, що ваша ОС зможе робити лише близько 1000
контекстних перемикачів між потоками/процесами в секунду. Це
означає, що пару по 100 запитів/відповідей у секунду. Якщо ви
робите тест на Linux, і ви вважаєте, що можете зробити набагато
більше, ігноруйте це.
Спробуйте зменшити залишок пам'яті життєво важливих даних.
Розподілені дані, як правило, видаляють кеш із дуже тонкими та
важко пояснюючими ефектами на продуктивність.