Измерить время исполнения кода на C/C++ с помощью функции clock()

Доброго времени суток! Представьте, вы написали очень крутую программу, она решает поставленную задачу, алгоритм отточен до мельчайших деталей, код отрефакторен так, что сам господь улыбнется при его чтении, все отлично! Вы пришли на работу(учебу, тусовку пограмистов) и всем его показали, и тут «Васек» спросит: «А быстро работает?». И тут вы понимаете свою ошибку! Не измерили скорость работы программы! Не потестировали с разной нагрузкой, и вообще, там может быть куча дыр связанных, которые покажутся только при стрессовой нагрузке.

Ладно, хватит. На самом деле, я просто хотел написать о том, как измерить скорость исполнения любого участка кода. Сделать это можно на любом языке программирования, каждый язык каким либо образом да сможет обратиться к системе и спросить текущее время в миллисекундах.

Я расскажу про C/C++ просто потому что именно на этих языках чаще всего измерял скорость работы кода, для самых разнообразных учебных задач. От сортировки пузырьком до топологической сортировки графов.

Специальный тип данных clock_t в C/C++

Это не что иное, как алиас(кличка, переименование) стандартного арифметического типа данных. В значение ставится количество процессорных тиков с момента его запуска. Получить это значение можно с помощью функции clock() из библиотеки <time.h>. Для того, чтобы перевести количество тиков в секунды используется константа из той же библиотеки CLOCKS_PER_SEC. Просто делим и получаем ответ.

Пример:

//Специальный тип данных из библиотеки time.h
clock_t currentTime;
//Берем текущее системное время
currentTime = clock();
//Участок кода, который нужно измерить
for(int i = 0; i < 9000; i++) {
    i *= i;
}
//Берем разницу
currentTime = clock() - currentTime;
//Переводим в секунды
currentTime = (double)currentTime / CLOCKS_PER_SEC;

Реализация загрузчика PE файлов в Windows

Продолжается погружение в запутанный мир системного программирования. Это вторая вторая часть и сегодня мы реализуем загрузчик исполняемых файлов Windows в точности по этому алгоритму.

Так как я сам являюсь гордым пользователем Linux Ubuntu, вся работа выполнена с помощью виртуальной машины. И вообще говоря, если вы занимаетесь системным программированием или разработкой драйверов, никогда не тестируйте свой код на реальной машине. Думаю тут без комментариев все понятно. Итак, виртуальная машина с win, язык низкого уровня и полный запас энтузиазма, поехали.

Система: Windows XP SP2
Язык программирования: C

читать далее «Реализация загрузчика PE файлов в Windows»

Быстрая шпаргалка: откровение про eof()

Проблема: в программе на C++ из файла считывается лишняя информация, либо последняя строка считывается дважды.

Пример кода

while(!file.eof()) {
    int a;
    file >> a;

    cout << a;
}

Дело в том, что проверять конец файла нужно непосредственно после считывания из него. Например так:

while(true) {
    int a;
    file >> a;

    if(file.eof()) {
        break;
    }
    
    cout << a;
}

 

Алгоритм загрузки PE файлов в Windows

Привет всем, кто забрел на эту заметку. Мной будет затронута не самая любимая тема: системное программирование. Дело в том, что волей судьбы я с ним столкнулся, в университете, если быть точнее. Пришлось знатно покопаться в самых низких слоях программирования, алгоритм разгрузки pe файлов оттуда. Надеюсь, что кому-нибудь пригодится мой опыт в этом деле, что вряд ли. Но тем не менее, я им поделюсь.

Если вам не интересен краткий экскурс в теорию работы pe загрузчика, то добро пожаловать сразу к реализации загрузчика PE файлов на C. Конечно же на Си, никаких скриптов, абстракций и прочего высокоуровнего кайфа, только хардкор!

Что такое PE файл

PE(Portable Executable) это основной формат исполняемых файлов для операционных систем семейства Windows NT. Используется для представления исполняемых файлов (.exe), динамических библиотек (.dll) и драйверов (.sys). Является расширением формата исполняемых файлов для DOS, то есть PE файл является корректной программой для системы DOS, но это нам не интересно. Мы будем запускать PE файлы под Windows собственноручно написанным загрузчиком.

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

Алгоритм загрузки PE файла в Windows

читать далее «Алгоритм загрузки PE файлов в Windows»