Кажется, что функции шифрования не выполняются последовательно во время бенчмаркинга;хронографических записей нет времени прошло - PullRequest
0 голосов
/ 01 мая 2019

Итак, я тестирую свои собственные реализации шифров AES и 3DES и режимов работы CBC и OFB для проекта класса, используя библиотеку std :: chrono. Базовая настройка:

chrono::steady_clock::time_point t0 = chrono::steady_clock::now();
MODECALL_E (ptext, key);
chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
MODECALL_D (ptext, key);
chrono::steady_clock::time_point t2 = chrono::steady_clock::now();

где MODECALL_E / D - это макросы, которые я изменяю на любую функцию, которую я тестирую во время компиляции (в частности, функцию режима работы, которая принимает функцию шифрования в качестве аргумента шаблона и затем вызывает ее внутри). Затем я зацикливаю этот код и записываю время, затраченное на шифрование и дешифрование преобразованием в chrono :: microseconds:

timing_return ret;
ret.etime = chrono::duration_cast<chrono::microseconds> (t1 - t0);
ret.dtime = chrono::duration_cast<chrono::microseconds> (t2 - t1);

и затем я сохраняю etime.count () и dtime.count () в выходном файле.

Однако значительное количество запусков для шифра AES в обоих режимах работы записывается с истекшим нулевым временем, иногда для шифрования, а иногда для дешифрования. Я также попытался привести к наносекундам, чтобы убедиться, что это не просто проблема с разрешением, и там было еще много нулевых записей, поэтому очевидно, что что-то не работает правильно. К вашему сведению, типичное время (варьирующееся для разных размеров ключей) находится в диапазоне 10-15 мс для шифрования текстового файла размером 4 КБ.

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

Я действительно озадачен этим, у кого-нибудь есть идея, что происходит? Я скомпилировал код, используя -O3; может быть, какая-то оптимизация как-то пропускает прогоны функций? Обратите внимание, что это происходит только с шифром AES, а не с 3DES, но это происходит как в режимах CBC, так и в режиме OFB.

Полный код для реализации (довольно обширный), включая код для тестирования, можно найти по адресу https://github.com/georgehodgkins/ECE5397project, если есть что-то еще, что вы хотели бы увидеть.

...