Есть ли способ измерить эффективность программы независимо от процессора?

Я пытаюсь построить онлайн-судью по проблемам программирования (например, UVA OJ). Когда программы оцениваются, необходимо проверить их эффективность (т. Е. Насколько быстро они могут обрабатывать входные данные теста). Однако на серверах процессоры, как правило, очень мощные и могут очень быстро выполнять даже плохо закодированные программы. Кроме того, некоторые программы могут получить больше ресурсов процессора при низком трафике, а некоторые программы могут получить меньше из-за высокого трафика, что несправедливо.

Мне было интересно, есть ли способ измерить эффективность программы независимо от того, на каком процессоре она работает? Может быть, с некоторыми вычислениями цикла процессора или что-то в этом роде?

Замечания:

  1. Я использую PHP на стороне сервера.
  2. Я могу использовать команды Linux на сервере.
  3. Я могу запросить программы Linux для установки на сервере.
  4. Я думаю, что могу ограничить использование памяти процессом (который имеет дело с эффективностью памяти), но я не знаю, как ограничить использование процессора. Я спросил здесь об этом.

Так что любое решение Linux или PHP было бы здорово.

1 ответ

Решение

Окружающая среда. Как я понимаю вашу проблему, вы хотите измерить производительность программы, написанной тестирующим, а затем захотите сравнить эту производительность с эталонной или с другими программами тестируемого. Эти программы будут работать на разных веб-серверах. Тестируемый получит доступ к программе тестирования через браузер. Тестируемые будут распределены по некоторой сети (локальной для лаборатории? Кампусу? К миру?). Тестовый ввод из файла. Ожидаемое время выполнения программ составляет <5 секунд, в среднем 1 секунда.

Метрика: процессорное время вам не поможет, потому что это зависит от аппаратного обеспечения. Например, предположим, что вы сравниваете производительность той же программы с привязкой к процессору на сервере Intel Xeon поколения Haswell, а не на Pentium первого поколения. Выполнение одной и той же программы одинаково эффективно, но у той, которая работает на Pentium, время процессора значительно больше из-за аппаратного обеспечения, на котором она работает. Даже если вы приступили к циклам (см. PAPI), у вас возникнет та же проблема. Ключ в том, что вам нужно сравнить производительность программ (время выполнения) с некоторыми стандартными ссылками.

Решение: это возможное решение. Это теоретически возможно, но не может быть практичным, учитывая веб-технологии и ограничения. Вы создаете стандартную справочную программу (std_pgm), а затем запускаете ее одновременно с программой тестируемого (tt_pgm). Ключ "одновременно". Вы хотите, чтобы и tt_pgm, и ваш std_pgm работали в одной среде (процессор, ОС, загрузка и т. Д.). Затем вы можете сравнить относительную производительность в разных средах.

Другие вопросы: (a) Вам необходимо убедиться, что программы выполняются одновременно с одними и теми же фоновыми процессами. Они не обязательно должны работать на одном и том же ядре, если ядра загружены одинаково. (b) Постарайтесь минимизировать время настройки процесса и время ввода-вывода файла по сравнению со временем выполнения программ. (c) Запускать программы несколько раз, в идеале в рамках одного и того же процесса. Это служит двум целям: легче сравнивать tt_pgm и std_pgm и дает метрику относительно того, являются ли среды выполнения tt_pgm и std_pgm одинаковыми. (Если производительность tt_pgm по сравнению с std_pgm значительно варьируется, это означает, что что-то происходит в фоновом режиме с одним, а не с другим.)

Я не гарантирую, что это сработает, но мне это кажется разумным.

Другие вопросы по тегам