![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| FiMa1 |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 408 Регистрация: 23.9.2006 Репутация: нет Всего: 6 |
Доброго времени суток, друзья!
Мне было необходимо прочитать файл, размером более или приближенном к 1 Мб. Выбранное решение не показалось мне достаточно быстрым. Поиски предложений на эту тему в Интернете не принесли много результатов. Однако я выяснил, что быстрее всего будет либо прочитать файл одним куском, читать его кусками по 2 кб, или читать, предварительно открыв файл посредством функции CreateFile (Platform SDK: File Systems). Выгодным, кроме того, является чтение файла предварительно открытого в бинарном (untranslated) режиме. Я решил сравнить различные варианты, использованный мной код и результаты приведены ниже. Использованный код:
Результаты (для текстового файла размером 689674 байтов):
Таким образом, в моем случае, наиболее быстрым оказался вариант с использованием ReadFile (Platform SDK: File Systems) и fread (<stdio.h>), с предварительным открытием файла в бинарном режиме. Самым медленным оказался вариант с посимвольным чтением в стиле C++:
Если у вас есть какие-либо другие предложения, огласите, пожалуйста. |
||||||
|
|||||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 10 Всего: 124 |
Попробуйте вот так вот
Это пример из программы вычисления CRC32, где весь файл должен быть прочтён последовательно |
|||
|
||||
| FiMa1 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 408 Регистрация: 23.9.2006 Репутация: нет Всего: 6 |
Среднее пяти замеров: 481824 тиков ЦПУ (Solution Configuretion = Release) |
||||
|
|||||
| DubrovinAV |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 20.9.2007 Репутация: нет Всего: нет |
Откройте тайну, как показания системного таймера снимали? Интересует консоль.
Заранее спасибо. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
GetTickCount()
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 10 Всего: 124 |
Концептуально правильным является вот такое вот измерение
При необходимости (многопоточная программа) меняем Process на Thread Вот тут вот есть детали |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Здорово. Выходит что эта функция измеряет чистое время работы фрагмента кода. Мне раньше приходилось делать несколько испытаний чтобы замерить минимальное время!
А этот алгоритм считает время которое тратит контроллер DMA на запись данных в ОЗУ? Ведь передача происходит без участия процессора. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 10 Всего: 124 |
Вот тут вот кое-какие комментарии почитайте
Вот эту вот ссылку, к примеру (по Vista Kernel, вроде бы три статьи Руссиновича, я их тут давал где-то в Разных вопросах, но давно, так что поищите там у Микрософта, статьи весьма и весьма) |
|||
|
||||
| DubrovinAV |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 20.9.2007 Репутация: нет Всего: нет |
Спасибо, работает.
А время он измеряет в интервалах, равных 100нс? Это сообщение отредактировал(а) DubrovinAV - 27.10.2007, 19:35 |
|||
|
||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 10 Всего: 124 |
Почитайте вот эту вот статью
Вот так вот можно
Это сообщение отредактировал(а) SergeCpp - 29.10.2007, 12:59 |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 7 Всего: 459 |
Похоже что с шагом в 15.625 мс. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 1 Всего: 207 |
какие такты имеются в виду? внутренние такты логического процессора? извините, но это бред нет такого точного таймера тот же HPET работает на частоте 69.841279 нс возьмем, к примеру, какой-нибудь C2D с System Bus Frequency (SBF) = 266 Mhz и Internal Frequency Rate (IFR) = 7 Internal Clock Frequency = SBF * IFR = 1862 Mhz т. е чтобы отследить 2 такта нужен таймер работающий как минимум на частоте 1.862 нс ни HPET, ни APIC таймеры не позволяют отсчитывать промежутки времени с такой точностью -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 12 Всего: 121 |
MAKCim, может внутренний счётчик процессора, который считывается по rdtsc? Но, учитывая сложность современных процессоров, там тоже мерятся не совсем такты.
-------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 10 Всего: 124 |
Это перевод такой неясный
Речь идёт об интервалах планировщика задач У Руссиновича (Внутреннее устройство...) и у Рихтера об этом говорится И вот тут говорится тоже |
|||
|
||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 10 Всего: 124 |
Меряются-то там такты, но вот использование намеренного там для определения времени (частота процессора меняться может) или числа тактов выполнения чего-либо (конвейер etc) — уже затруднено весьма |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |