Я уже имел возможность убедиться, что try-except - жутко тормозная штука. Но я всё ещё думал, что это штука надёжная. По крайней мере, она никогда не подводила меня в мире Win32. И вот я пошёл с этими представлениями в мир мобильных приложений. И пришёл к печальному выводу - try-except работает ещё и отнюдь не всегда. Увы, "кто умножает познания, умножает скорбь"/широко известный источник/
Вот пример, где я пытался замерить скорость работы try-except при попытке доступа к неассигнованным объектным переменным:
Сначала я пробую цикл с if Assigned(... - результат мгновенный: 0: 00:00:00:006. Теперь меняю Summ + V2 на Summ + V, и...
!!! Что же это за кака-бяка такая!!! И как дальше жить? Теперь, выходит, кроме создаваемых в коде исключений, отлавливать ничего не получится? Тоже не верно - перехватчик самого приложения всё-таки отработал, выдал сообщение, корректно завершил метод и даёт таким образом нам возможность нажимать на кнопку сколько угодно раз и сколько угодно раз любоваться этим "Access violation at address ..., accessing address 00000000." Но где это работает, а где нет? Где играть, где не играть, где рыбу заворачивать? Ы-ы-ы-ы-ы...
ЗЫ: Спасибо Владимиру Натановичу Винокуру за певца Григория Долголоба, служащего в Чугуевской филармонии.
Вот пример, где я пытался замерить скорость работы try-except при попытке доступа к неассигнованным объектным переменным:
procedure TForm5.Button1Click(Sender: TObject); var dt: TDateTime; I: Integer; A: array[ 0..9 ] of TStringList; function V: Integer; begin try Result := A[ I mod 10 ].Count; except Result := 0; end; end; function V2: Integer; var Index: Integer; begin Index := I mod 10; if Assigned( A[ Index ] ) then Result := A[ Index ].Count else Result := 0; end; var Summ: Integer; begin FillChar( A, SizeOf( A ), 0 ); for I := Low(A) to High(A) do if Odd( I ) then A[I] := TStringList.Create; dt := Now; try Summ := 0; for I := 0 to 1000000 do Summ := Summ + V2; ShowMessage( IntToStr( Summ ) + ': ' + FormatDateTime( 'hh:nn:ss:zzz', Now-dt ) ); finally for I := Low(A) to High(A) do if Odd( I ) then FreeAndNil( A[I] ); end; end;
Сначала я пробую цикл с if Assigned(... - результат мгновенный: 0: 00:00:00:006. Теперь меняю Summ + V2 на Summ + V, и...
!!! Что же это за кака-бяка такая!!! И как дальше жить? Теперь, выходит, кроме создаваемых в коде исключений, отлавливать ничего не получится? Тоже не верно - перехватчик самого приложения всё-таки отработал, выдал сообщение, корректно завершил метод и даёт таким образом нам возможность нажимать на кнопку сколько угодно раз и сколько угодно раз любоваться этим "Access violation at address ..., accessing address 00000000." Но где это работает, а где нет? Где играть, где не играть, где рыбу заворачивать? Ы-ы-ы-ы-ы...
ЗЫ: Спасибо Владимиру Натановичу Винокуру за певца Григория Долголоба, служащего в Чугуевской филармонии.
Комментариев нет:
Отправить комментарий