2015-01-15 3 views
0

Я никогда не могу заставить простой таймер работать независимо от того, что я пытаюсь. Как мне узнать, сколько миллисекунд потребовалось для сегмента кода для запуска без внешних библиотек?Сроки функции

Я пробовал:

time_t total = static_cast<time_t>(0.0f); 
for(int i = 0; i < 10; ++i) 
{ 
    time_t start = time(0); 
    for(int b = 0; b < 100; ++b) 
    { 
     newMesh.IsValid(); 
    } 
    time_t end = time(0); 
    total += (end - start); 
} 

time_t average = total/10; 
printf("Average time of Knight IsValid check %d\n", average); 

Это займет около 15 секунд и говорит, что он занял 1 миллисекунду. Я также пробовал:

std::clock_t total = static_cast<time_t>(0.0f); 
for(int i = 0; i < 10; ++i) 
{ 
    std::clock_t start = std::clock(); 
    for(int b = 0; b < 100; ++b) 
    { 
     newMesh.IsValid(); 
    } 
    std::clock_t end = std::clock(); 
    total += (end - start); 
} 

std::clock_t average = total/10; 
printf("Average time of Knight IsValid check %d\n", average); 

Но мне сказали, что это часы, которые не подходят для профилирования?

+1

Существует очень простой пример на [cppreference.com] (http://en.cppreference.com/w/cpp/chrono/steady_clock/now), что я думаю, будет делать то, что вам нужно. – 5gon12eder

+0

Кажется, у вас нет хроно? Я использую Visual Studio 2012. – marsh

+0

Это функция C++ 11. Возможно, вам понадобится добавить специальный флаг компилятора, такой как '-std = C++ 11' для GCC или обновить ваш компилятор. Это будет стоить того. – 5gon12eder

ответ

0

В C++ 11 можно использовать <chrono> (работая в GCC 4.9.1 с C++ 11 и Visual Studio 2012 Update 2):

Пример кода:

#include <iostream> 
#include <chrono> 
#include <iomanip> 

int main() { 
    std::chrono::steady_clock::time_point begin_time = std::chrono::steady_clock::now(); 

    // add code to time here 

    std::chrono::steady_clock::time_point end_time = std::chrono::steady_clock::now(); 
    long long elapsed_seconds = std::chrono::duration_cast<std::chrono::seconds>(end_time - begin_time).count(); 
    std::cout << "Duration (min:seg): " << std::setw(2) << std::setfill('0') << (elapsed_seconds/60) << ":" << std::setw(2) << std::setfill('0') << (elapsed_seconds % 60) << std::endl; 

    return 0; 
} 

Вы можете создать экземпляр duration_cast с другими измерениями времени (например, миллисекунды, наносекунды и т. Д.).
Более подробную информацию с примерами кода в конце: http://en.cppreference.com/w/cpp/chrono

+0

'std :: system_clock', вероятно, не лучший выбор для синхронизации производительности, так как понятие времени подвержено случайным настройкам (например, демоном NTP). Лучше использовать 'std :: stable_clock'. – 5gon12eder

+0

У меня нет доступа к хроно, к сожалению. – marsh

+0

В комментариях, которые вы говорите, которые используют VS2012, это было протестировано в VS2012 Update2, уверены, что у вас нет хронографа, или есть простая причина, почему бы не использовать. – NetVipeC

Смежные вопросы