Блог пользователя ioanisyan

Автор ioanisyan, 12 лет назад, По-русски

Как измерить время выполнения программы в миллисекундах ?

  • Проголосовать: нравится
  • +2
  • Проголосовать: не нравится

»
12 лет назад, # |
Rev. 3   Проголосовать: нравится +1 Проголосовать: не нравится

Например, так:

#include <ctime>
#include <cstdio>

int main() {
  double start = clock();
  // Insert your code here
  printf("%.4lf\n", (clock() - start) / CLOCKS_PER_SEC);
  return 0;
}

Выведет время программы в секундах, с дробной частью. Обычно CLOCKS_PER_SEC=1000, поэтому можно и в целых числах.

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится +8 Проголосовать: не нравится

    Не очень точно, потому что clock() возвращает астрономическое время. При тестировании используется процессорное, а его изнутри программы я не знаю, как считать.

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Да, конечно. Я не думаю, что надо точно. Ну, под виндой можно сделать GetCurrentProcess() и вперёд с песней.

      • »
        »
        »
        »
        12 лет назад, # ^ |
          Проголосовать: нравится +8 Проголосовать: не нравится

        под линухой можно запускать через time :)

    • »
      »
      »
      12 лет назад, # ^ |
      Rev. 6   Проголосовать: нравится +5 Проголосовать: не нравится

      А разве clock() везде возвращает астрономическое время?

      В linux, например, $man 3p clock говорит:

      NAME
             clock - report CPU time used
      
      SYNOPSIS
             #include <time.h>
      
             clock_t clock(void);
      
      
      DESCRIPTION
             The clock() function shall return the implementation''s best approximation to the processor time used by the process since the beginning of an implementation-defined era related only to the process invocation.
      
  • »
    »
    12 лет назад, # ^ |
    Rev. 11   Проголосовать: нравится +8 Проголосовать: не нравится

    Я не понял последнего утверждения. Как связаны целые числа и то, чему равно CLOCKS_PER_SEC?

    Да и вообще говоря:

    > man 3 clock
    ...
    CONFORMING TO
        C89, C99, POSIX.1-2001. POSIX requires that CLOCKS_PER_SEC equals
        1000000 independent of the actual resolution.

    offtop: пока отформатировал этот несчастный вывод чуть не помер. Что я делаю не так? В пяти тильдах не форматируется, пришлось руками, через html-код всё выравнивать. ...

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Просили время в миллисекундах. Чтобы не домножать дабл на 1000 и творить чудеса, можно сделать всё в целых.

      man/POSIX под Windows? Не, не слышал :) В MinGW 4.6.1 равен 1000.

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Спасибо, но при одинаковых тестов времена выполнениев отличаются, чего посоветуете ?

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Это нормально, если несильно отличаются.

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      посоветую посчитать среднее

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      как раз речь о том, что использовать астрономическое время не совсем точно, оно сильно зависит от текущей загрузки системы. Процессорное — не зависит от того, что вы еще параллельно делаете

»
12 лет назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится

Под Windows можно использовать либо runexe (написано нами — Саратовским ГУ), либо run.exe (авторства ИТМО). Я рекомендую наш вариант :) он не запускает код в дебаге, а иногда запуск в debug приводит к очень странным (читай неправльным( измерениям.

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Ага, иногда на порядок-другой время работы изменяется. А не знаете, зачем запускать в debug?

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Так они ловят некоторые events — типа, что программа создала другой процесс и видимо кое-что еще.

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Кажется это чаще всего происходит при работе с динамическими структурами или большой рекурсией.

      • »
        »
        »
        »
        12 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Кажется, утверждается, что под debug медленно работает delete. То есть если совсем много удаляется, то run.exe замедляет выполнение очень сильно. Кстати, интересно как они с этим борются на официальных соревнованиях. Представители ИТМО есть? Расскажете?

        • »
          »
          »
          »
          »
          12 лет назад, # ^ |
            Проголосовать: нравится 0 Проголосовать: не нравится

          Вроде есть какой-то хитрый ключ в реестре

          • »
            »
            »
            »
            »
            »
            12 лет назад, # ^ |
              Проголосовать: нравится 0 Проголосовать: не нравится

            Интересно какой именно. Кстати, полезно-же опубликовать — иначе зачем run.exe вообще нужен? Ведь его важная задача определять время работы для околоолимпиадных целей, а там такие программы, где он будет лажать не редкость. Даже пользоваться как-то страшно. Или вот люди PCMS2 ставят, они это настраивают?

            • »
              »
              »
              »
              »
              »
              »
              12 лет назад, # ^ |
                Проголосовать: нравится +19 Проголосовать: не нравится

              Нужно прописать такой ключ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\your_exe_name.exe

              • »
                »
                »
                »
                »
                »
                »
                »
                12 лет назад, # ^ |
                  Проголосовать: нравится 0 Проголосовать: не нравится

                Спасибо. Правильно я понимаю, что такое предполагается прописывать для каждого exe (напр., java, все интерпретаторы), а компилируемые переименовывать в какое-то хардкодное имя? your_exe_name.exe — это только имя файла, без пути? (например, main.exe).

                • »
                  »
                  »
                  »
                  »
                  »
                  »
                  »
                  »
                  12 лет назад, # ^ |
                    Проголосовать: нравится 0 Проголосовать: не нравится

                  Да, именно так. Ну либо написать обертку, которая добавит в реестр ключ для запускаемого файла, запустит, а потом ключ удалит (можно даже на cmd, при помощи reg add и reg delete)

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Спасибо , a как пользоваться runexe-ом ?

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится +7 Проголосовать: не нравится

      runexe -h, но если просто хотите измерить время, то runexe solution.exe. Можно runexe -i input.txt -o output.txt solution.exe если хотите перенаправлять ввод/вывод на стандартный из файлов. Еще вариант runexe -t 2s -i input.txt -o output.txt solution.exe — это с ограничением по времени.

      • »
        »
        »
        »
        12 лет назад, # ^ |
          Проголосовать: нравится +4 Проголосовать: не нравится

        Для Farа очень удобно поставить ассоциацию с типом файлов *.exe и по нажатию например на F4, чтобы запускался runexe. Всегда так делаю))

      • »
        »
        »
        »
        12 лет назад, # ^ |
          Проголосовать: нравится 0 Проголосовать: не нравится

        Я как-то раз пробовал запускать runexe с указанием логина и пароля юзера, под правами которого я хотел чтоб программа запустилась. Но у меня это так и не получилось. Там видимо надо какие-то специальные привилегии настраивать?

        Тот же вопрос относится и к run.exe от ИТМО...

        • »
          »
          »
          »
          »
          12 лет назад, # ^ |
            Проголосовать: нравится +12 Проголосовать: не нравится

          Для run.exe надо так — допустим, мы работаем под аккаунтом Jury и хотим запустить под аккаунтом invoker. Тогда Jury навешиваем привилегии "Increase quotas" (SeIncreaseQuota) и "Replace a process level token" (SeAssignPrimaryToken), а invoker — "Log on as batch job" в Administrative Tools — Local Security Settings — Local Policies — User Right Assignment. У меня вдобавок Jury имеет администраторские права, что небезопасно, но отнимать не пробовал; надо попытаться :)

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Кстати, правильно ли я понимаю, что исходники файла /src/runlib/runlib32-static.lib закрыты? Если да, то можно ли узнать, в каких случаях выдаётся ошибка SECURITY_VIOLATION (т.е., за чем следит runexe)? Потому что, например, за работой с ФС вроде из общедоступных запускальщиков под Windows никто не следит.

  • »
    »
    6 лет назад, # ^ |
      Проголосовать: нравится +9 Проголосовать: не нравится

    А планируется ли переезд runexe с закрытого хостинга на, скажем, GitHub?

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Есть еще такая вещь, как QueryPerformanceCounter (вкупе с QueryPerformanceFrequency). Измеряет кол-во "тиков" процессора с момента запуска системы, поэтому выходит довольно точно. Не знаю, как в других средах, но как-то пробовал измерять время работы кода на Delphi, проблема была только одна — погрешность +/-0.5 ms (ибо на машине работают еще и другие программы, которые отнимают время). Ну, если совсем точно надо — можно посчитать раз 20 и найти среднее :))

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

ptime — меряет хорошо. Можно скопировать в папку с прогой, время работы которой хочется измерить. Перенаправление ввода-вывода и вызов программы (предварительно перейдя в папку с ней): ptime program < input.txt > output.txt. Без перенаправления так: ptime program. Из замеченных глюков — иногда файлы долго открываются (не у всех, в частности наблюдаю у себя на винде, но это сбои ФС), и порой 500 мс можно легко скинуть (это уже экспериментировать со своей системой надо). Но на большинстве машин такого не наблюдается, и время показывается "нормальное".

»
12 лет назад, # |
Rev. 2   Проголосовать: нравится +7 Проголосовать: не нравится

http://www.cplusplus.com/reference/clibrary/ctime/clock/

P.S. in english version previous comments aren't shown, no need to "vote down".

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Подскажите, как при помощи run.exe запретить создание дочерних процессов? Например, вот такой код

#include <iostream>
using namespace std;
int main()
{
	system("notepad.exe");
	return 0;
}
run -y 3s a.exe

успешно выполняется. Время будет считаться до тех пор, пока блокнот не будет закрыт вручную. После этого, вердикт будет Idleness limit exceeded. Но хотелось бы, чтобы дочерние процессы убивались автоматически.