ответ на задание 1 (1124141), страница 2
Текст из файла (страница 2)
number of ticks = 1582264168
number of ticks = 1570760025
number of ticks = 1593575535
number of ticks = 1629494500
number of ticks = 1573569621
среднее = 1592136728
с учётом тактовой частоты процессора это примерно 0,663 секунды,
После изменения порядка просмотра массива в цикле (a[i][k] -> a[k][i]):
number of ticks = 3317490683
number of ticks = 3345373438
number of ticks = 3298421271
number of ticks = 3212642912
number of ticks = 3191041134
number of ticks = 3228493816
number of ticks = 3199944640
number of ticks = 3186065623
number of ticks = 3398632487
number of ticks = 3270805276
среднее = 3264891128
с учётом тактовой частоты процессора это примерно 1,36 секунды
Тестирование под windows
-
Характеристики системы:
-
Процессор - Core 2 Duo - 2 ядра по 2,4 GHz (используется конечно же одно (за исключением того, что некоторые вызовы оси могут быть паралельны))
-
Windows 7 x64 – хостовая машина (не виртуальная)
-
Компиляция с полным отключением оптимизации, тестирование было через __rdtsc () (смотри пример использования выше)
Результаты (компиляция была в режиме Release x64)
number of ticks = 1272429415
number of ticks = 1217791503
number of ticks = 1211113828
number of ticks = 1217113165
number of ticks = 1214894971
number of ticks = 1201390669
number of ticks = 1199625319
number of ticks = 1193677596
number of ticks = 1199743398
number of ticks = 1209035727
среднее значение = 1213681559,1
с учётом тактовой частоты это 0,505s – что несколько быстрее, чем в случаях тестирования из под linux, установленного как виртуальная машина
-
При смене индексации по массиву результаты становятся следующими:
number of ticks = 3442521213
number of ticks = 3607482681
number of ticks = 3339299044
number of ticks = 3295363860
number of ticks = 3383916652
number of ticks = 3339608590
number of ticks = 3376704114
number of ticks = 3327883992
number of ticks = 3320031942
number of ticks = 3479668713
среднее значение = 3391248080,1
с учётом тактовой частоты это 1,413s – таким образом прирост от смены системы составил почти ничего, потому что проблема в том, что всё упирается в скорость передачи по шине через кеши.
-
Отмечу любопытный факт – если установить в Visual Studio флаг оптимизации на максимальную производительность (так оно по умолчанию), то количество тактов, за которое будет выполняться программа, будет равно 36 тактам.
-
Использование профилирования в Visual Studio:
Если пойти в Analyze -> Performace and Diagnostics, то запустится профилирование программы, и потом можно будет посмотреть результаты в виде красивых таблиц, и пометок прямо в коде, вот таких например:
Здесь прямо указано, на что тратится больше всего времени (в режиме с инвертированными индексами)
Так же есть таблицы с общим выполнением программы по времени, таблицы с учетом выполнения по времени ассемблерных конструкций, в которые скомпилировался код.
Объяснения (подведение итогов)
-
Способов профилирования – тьма
-
Самое удобное – в Visual Studio
-
Важно учитывать время, затраченное на то, чтобы перегнать данные из оперативной памяти в процессор, поэтому порядок индексирования важен
-
Необходимо использовать несколько замеров, что бы усреднить разброс.
-
Выполнение программ под виртуальной машиной сильно медленнее (0,5s против 1s)
-
Компиляция в режиме оптимизации может сильно сократить время работы (сокращение было с миллиарда до 36 тактов).
-
Для того чтобы уменьшить разброс было запущенно по 10 тестов для time и rdtsc.