Итак, GCC 11.2.0
Без оптимизации, -m32
Первый вариант — получение размера всего файла, выделение памяти и чтение сразу в память, после чего обработка (поиск 0x01, который находится в самом конце файла).
Файл весит 1 ГБ.
Скорость выполнения кода (внутренний clock, сек.): 4.743380
Общее кол-во выполненных инструкций: 10,737,601,977
Данные по кэшу:
I1 misses: 1,438
LLi misses: 1,420
I1 miss rate: 0.00%
LLi miss rate: 0.00%
D refs: 6,442,528,090 (6,442,504,347 rd + 23,743 wr)
D1 misses: 16,778,976 ( 16,778,688 rd + 288 wr)
LLd misses: 16,778,721 ( 16,778,453 rd + 268 wr)
D1 miss rate: 0.3% ( 0.3% + 1.2% )
LLd miss rate: 0.3% ( 0.3% + 1.1% )
LL refs: 16,780,414 ( 16,780,126 rd + 288 wr)
LL misses: 16,780,141 ( 16,779,873 rd + 268 wr)
LL miss rate: 0.1% ( 0.1% + 1.1% )
Второй вариант — получение размера, разделение его на блоки по 10 МБ, чтение+обработка.
1 ГБ / 10 МБ = 102 итераций (чтений) + проверка на кратность, и подброс оставшихся байт
Скорость выполнения кода (внутренний clock, сек.): 4.861692
Общее кол-во выполненных инструкций:9,668,078,565
I1 misses: 1,446
LLi misses: 1,428
I1 miss rate: 0.00%
LLi miss rate: 0.00%
D refs: 5,372,994,835 (5,372,965,524 rd + 29,311 wr)
D1 misses: 16,780,106 ( 16,779,511 rd + 595 wr)
LLd misses: 16,779,854 ( 16,779,279 rd + 575 wr)
D1 miss rate: 0.3% ( 0.3% + 2.0% )
LLd miss rate: 0.3% ( 0.3% + 2.0% )
LL refs: 16,781,552 ( 16,780,957 rd + 595 wr)
LL misses: 16,781,282 ( 16,780,707 rd + 575 wr)
LL miss rate: 0.1% ( 0.1% + 2.0% )
Вопрос 1 - Нельзя ли было использовать 2 разных файла одинакового размера?
Вопрос 2 - Почему бы просто не посмотреть в тактах с помощью витюна?