All streams
Search
Write a publication
Pull to refresh
159
0
Александр (Rouse_) Багель @Rouse

Инженер — программист

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

var
  I: Integer;
  Buff: array [0..5] of Byte;
begin
  for I := 0 to 5 do
    Buff[I] := I;

асм листинг:

Unit1.pas.43: for I := 0 to 5 do
005DAA67 33D2             xor edx,edx
005DAA69 8BC4             mov eax,esp
Unit1.pas.44: Buff[I] := I;
005DAA6B 8810             mov [eax],dl
005DAA6D 42               inc edx
005DAA6E 40               inc eax
Unit1.pas.43: for I := 0 to 5 do
005DAA6F 83FA06           cmp edx,$06
005DAA72 75F7             jnz $005daa6b

вот то-же самое, но для массива индексирующегося с 10:

var
  I: Integer;
  Buff: array [10..15] of Byte;
begin
  for I := 10 to 15 do
    Buff[I] := I;

асм листинг:

Unit1.pas.34: for I := 10 to 15 do
005DAA4F BA0A000000       mov edx,$0000000a
005DAA54 8BC4             mov eax,esp
Unit1.pas.35: Buff[I] := I;
005DAA56 8810             mov [eax],dl
005DAA58 42               inc edx
005DAA59 40               inc eax
Unit1.pas.34: for I := 10 to 15 do
005DAA5A 83FA10           cmp edx,$10
005DAA5D 75F7             jnz $005daa56


как можно увидеть никаких вычитаний типа Pred и прочего тут попросту нет.
Статические так же, но их принято с нуля задавать :)
Ага — в дельфях (32 битных) так всегда и было :)
Когда же в дельфи индексация с нуля, получается глупость: язык не приспособлен для этого, и появляются странные и неестественные вычитания единиц.

Здесь опять-же сказывается отсутствие знаний в предметной области, и не понимание самого принципа работы Delphi компилятора, обрабатывающего такие конструкции.:)
Не обижайтесь — но вы действительно сказали не правильную мысль :)
Позвольте, но это в паскале или в бейсике, а в Delphi для массивов индексация идет с нуля.
С единицы индексируются только строки, если, конечно, не включена директива {$ZEROBASEDSTRINGS ON}
Все переменные, на которые есть ссылки из анонимного метода, будут «захвачены» компилятором и размещены не на стеке, а в куче

Кстати — отлично подмечено, причем тут даже не обязательно многопоточность, достаточно это исполнить рекурсивно и изучить, где в памяти будет расположена каждая из таких переменных.

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity