ReadClassStg/WriteClassStg я упомянул в декларации заголовка, но сам их не использую (не было надобности).
А по поводу вызова Commit — к сожалению не на всех машинах происходит автоматическая запись данных, но закономерности я не понял, поэтому всегда вызываю его принудительно, во избежание :)
Ну а вызывать его в принципе нужно один раз, перед закрытием хранилища, вызвав его для рута.
Т.е. плюем на gdi хэндлы, коих достаточно мало на всю систему и крутим цикл, спрашивая, почему тормозит? Забавно :)
А вообще подход интересный, про один из нюансов не знал, так что автору плюс :)
Ага, действительно, как только перешли на Delphi, с паскаля, так все и поменялось :)
Кстати, а зачем вы так удачно обошли механизм реаллока памяти, упомянув про конкатенацию? Это действительно так работает только в Дельфи? :)
Но впрочем я пожалуй смогу утверждать, что даже после кокатенации строк, что в сях, что в дельфи — это будет именно единый и непрерывный массив.
Хотите поспорить? :)
Ну и последний момент: результат выполнения функции идет через регистр EAX, а BY REF параметр в виде VAR переменной — по сути ссылка (не важно даже куда она ведет, на область в куче, или собственную память, выделенную посредством VirtualAlloc), что, в итоге, дает дополнительный оверхед при ее использвании.
Этот момент желательно учитывать.
Опять не согласен :)
1. Вызов функции приводит к обязательной инициализации параметра Result.
2. Однако — вызов процедуры с Handled флагом (как var параметр) приводит к обязательной инициализации VAR параметра.
Вопрос — так где выгода, не те-же ли яйца, только в профиль? :)
А я бы не согласился :)
ForEach — как любая итеративная функция имеет право на досрочный выход.
За базу возьмем, к примеру, операцию Cut-Paste файлов из папки в папку, посредством ForEach обертки.
К примеру путь одного из копируемых файлов выходит за диапазон MAX_PATH, что делать?
В ОС принято отображать диалог, в котором пользователь имеет полное право отменить столь сомнительную операцию :)
Не-не, я не про то говорю :)
Вот возьмем ситуацию с Overflow — и присвоим инту значение выше диапазопа $7FFFFFF — разве это повлияет на работоспособность ПО, тем более что в криптографии это вообще штатная и допустимая сущность?
Вообще, все ошибки связанные с переполнение должны быть покрыты еще на этапе альфатеста посредством юниттестов.
В моей практике еще ниразу не встретилось что-то что повлияло на работоспособность нашего ПО, после юнит-тестирования со всеми галками.
Поэтому и считаю данный шаг не только избыточным, но и вредным — лучше расширять нагрузочное тестирование, чем выдавать свои ляпы пользователю.
В клайнем случае — та-же EurekaLog спасет и покажет место.
На скорость, конечно не повлияет (ну тут как — скажем, это будет незаметно для пользователя), а вот делать конечного пользователя бетатестером — это тот еще юмор :)
Мы все комплексные тесты проводим со всеми включенными отладочными галками, включая ассерты, но в релиз все уходит в отключенном виде.
А для поиска ошибок (в релизе) мы используем EurekaLog.
Когда же в дельфи индексация с нуля, получается глупость: язык не приспособлен для этого, и появляются странные и неестественные вычитания единиц.
Здесь опять-же сказывается отсутствие знаний в предметной области, и не понимание самого принципа работы Delphi компилятора, обрабатывающего такие конструкции.:)
Не обижайтесь — но вы действительно сказали не правильную мысль :)
Позвольте, но это в паскале или в бейсике, а в Delphi для массивов индексация идет с нуля.
С единицы индексируются только строки, если, конечно, не включена директива {$ZEROBASEDSTRINGS ON}
Все переменные, на которые есть ссылки из анонимного метода, будут «захвачены» компилятором и размещены не на стеке, а в куче
Кстати — отлично подмечено, причем тут даже не обязательно многопоточность, достаточно это исполнить рекурсивно и изучить, где в памяти будет расположена каждая из таких переменных.
А по поводу вызова Commit — к сожалению не на всех машинах происходит автоматическая запись данных, но закономерности я не понял, поэтому всегда вызываю его принудительно, во избежание :)
Ну а вызывать его в принципе нужно один раз, перед закрытием хранилища, вызвав его для рута.
А вообще подход интересный, про один из нюансов не знал, так что автору плюс :)
Кстати, а зачем вы так удачно обошли механизм реаллока памяти, упомянув про конкатенацию? Это действительно так работает только в Дельфи? :)
Но впрочем я пожалуй смогу утверждать, что даже после кокатенации строк, что в сях, что в дельфи — это будет именно единый и непрерывный массив.
Хотите поспорить? :)
Этот момент желательно учитывать.
1. Вызов функции приводит к обязательной инициализации параметра Result.
2. Однако — вызов процедуры с Handled флагом (как var параметр) приводит к обязательной инициализации VAR параметра.
Вопрос — так где выгода, не те-же ли яйца, только в профиль? :)
ForEach — как любая итеративная функция имеет право на досрочный выход.
За базу возьмем, к примеру, операцию Cut-Paste файлов из папки в папку, посредством ForEach обертки.
К примеру путь одного из копируемых файлов выходит за диапазон MAX_PATH, что делать?
В ОС принято отображать диалог, в котором пользователь имеет полное право отменить столь сомнительную операцию :)
Вот возьмем ситуацию с Overflow — и присвоим инту значение выше диапазопа $7FFFFFF — разве это повлияет на работоспособность ПО, тем более что в криптографии это вообще штатная и допустимая сущность?
Вообще, все ошибки связанные с переполнение должны быть покрыты еще на этапе альфатеста посредством юниттестов.
В моей практике еще ниразу не встретилось что-то что повлияло на работоспособность нашего ПО, после юнит-тестирования со всеми галками.
Поэтому и считаю данный шаг не только избыточным, но и вредным — лучше расширять нагрузочное тестирование, чем выдавать свои ляпы пользователю.
В клайнем случае — та-же EurekaLog спасет и покажет место.
Мы все комплексные тесты проводим со всеми включенными отладочными галками, включая ассерты, но в релиз все уходит в отключенном виде.
А для поиска ошибок (в релизе) мы используем EurekaLog.
асм листинг:
вот то-же самое, но для массива индексирующегося с 10:
асм листинг:
как можно увидеть никаких вычитаний типа Pred и прочего тут попросту нет.
Здесь опять-же сказывается отсутствие знаний в предметной области, и не понимание самого принципа работы Delphi компилятора, обрабатывающего такие конструкции.:)
Не обижайтесь — но вы действительно сказали не правильную мысль :)
С единицы индексируются только строки, если, конечно, не включена директива {$ZEROBASEDSTRINGS ON}
Кстати — отлично подмечено, причем тут даже не обязательно многопоточность, достаточно это исполнить рекурсивно и изучить, где в памяти будет расположена каждая из таких переменных.