Форум: "Начинающим";
Текущий архив: 2007.07.29;
Скачать: [xml.tar.bz2];
ВнизИспользование SetFilePointerEx. Найти похожие ветки
← →
Riply © (2007-07-01 01:27) [0]Здравствуйте !
Подскажите, пожалуйста, как лучше поступить в такой ситуации:
Допустим нам надо установить "файловый поинтер" в новое значение - NewPointer.
NewPointer - ну очень болшое число :). Мы знаем, что в настоящее время,
"файловый поинтер" совсем рядом с NewPointer.
Какой из вариантов:
1. if SetFilePointerEx(Handle, 0, @OldPointer, FILE_CURRENT) then
SetFilePointerEx(Handle, NewPointer - OldPointer, nil, FILE_CURRENT);
2. SetFilePointerEx(Handle, NewPointer, nil, FILE_BEGIN);
лучше выбрать ?
P.S.
Просто я не знаю, как "внутри себя" работает SetFilePointerEx :(
← →
KilkennyCat © (2007-07-01 03:29) [1]Без разницы, наверное. Непонятно только, зачем проверка в 1.
← →
begin...end © (2007-07-01 09:11) [2]Лучше выбрать второй вариант.
← →
Riply © (2007-07-01 10:36) [3]> [1] KilkennyCat © (01.07.07 03:29)
>Без разницы, наверное. Непонятно только, зачем проверка в 1.
Там не проверка, а получение поинтера :)
>[2] begin...end © (01.07.07 09:11)
>Лучше выбрать второй вариант.
Спасибо.
А можно мотивировать это утверждение ?
Или оно "интуитивно ясно из общих соображений"(с) ? :)
← →
begin...end © (2007-07-01 12:29) [4]> Riply © (01.07.07 10:36) [3]
Близость требуемой позиции файлового указателя к его текущей позиции на этапе исполнения SetFilePointerEx не имеет значения. Перемещение указателя этой функцией сводится к вызову внутренней функции NtSetInformationFile, в которую должна передаваться требуемая абсолютная позиция указателя (смещение от начала файла).
С помощью отладчика легко убедиться, что в случае вызова SetFilePointerEx c флагом FILE_CURRENT внутри неё вначале будет вызвана NtQueryInformationFile, для определения текущего положения указателя и последующего вычисления абсолютного смещения. Если же использовать флаг FILE_BEGIN, вызова NtQueryInformationFile не потребуется.
Отсюда ясно, что первый вариант не только не принесёт никакого выигрыша в производительности, но даже и окажется медленнее второго варианта, из-за а) двойного вызова SetFilePointerEx; б) исполнения внутренних вызовов этой функции, ненужных в случае флага FILE_BEGIN.
← →
Riply © (2007-07-01 12:51) [5]> [4] begin...end © (01.07.07 12:29)
Спасибо большое !
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.07.29;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.043 c