Войти
ПрограммированиеФорумОбщее

Delphi 2009 - Оптимизация вашего приложения. (7 стр)

Страницы: 1 2 3 4 5 6 7
#90
15:09, 29 июня 2009

doc.
Ну открыл и посмотрел, что с ними не так?


#91
15:20, 29 июня 2009

drv47
> что с ними не так?
Во-первых они там пытаются проанализировать все что угодно, хотя в 99% случаев это ненужно, т.е. это специальный случай для которого проще использовать специальную функцию.
Во-вторых там в лучшем случае алгоритмически тоже самое (что и не удивительно в таком тривиальном алгоритме) только отягощенное флажками и т.п., а местами встречается типа такого:

if (s[I] = #0) then
    raise EConvertError.CreateResFmt(@SInvalidInteger, [S]);
   if not Negative then
    begin
     repeat
      if Result > (High(Result) div 10) then
       raise EConvertError.CreateResFmt(@SInvalidInteger, [S])
      else if Result = (High(Result) div 10) then
       begin
        if ('8' <= S[I]) and (S[I] <= '9') then
         raise EConvertError.CreateResFmt(@SInvalidInteger, [S]);
       end;
      if ('0' <= S[I]) and (S[I] <= '9') then
       Result := Result * 10 - Ord('0') + Ord(s[I])
      else
       raise EConvertError.CreateResFmt(@SInvalidInteger, [S]);
      Inc(I);
     until (S[I] = #0);
    end
   else
    begin
     repeat
      if Result > (High(Result) div 10) then
       raise EConvertError.CreateResFmt(@SInvalidInteger, [S])
      else if Result = (High(Result) div 10) then
       begin
        if (s[I] = '9') then
         raise EConvertError.CreateResFmt(@SInvalidInteger, [S]);
       end;
      if ('0' <= s[I]) and (s[I] <= '9') then
       Result := Result * 10 - Ord('0') + Ord(s[I])
      else
       raise EConvertError.CreateResFmt(@SInvalidInteger, [S]);
      Inc(I);
     until (s[I] = #0);
    end;
  end;
 if Negative then
  Result := -Result;
Как несложно заметить делается совершенно ненужная, в большинстве случаев, проверка.
#92
15:24, 29 июня 2009

doc.
lol, они просто пишут так, чтобы функция соответствовала спецификации. А не частные случаи, как вы.
А по-твоему подпрограмма не должны вываливаться с эксепшеном, если ей дали некорректные данные(быдлокод не в счет)? )

#93
15:32, 29 июня 2009

drv47
> они просто пишут так, чтобы функция соответствовала спецификации.
Да ради бога, но это не оправдывает код как в "партянке" выше, особенно если он претендует на fast.

>А по-твоему подпрограмма не должны вываливаться с эксепшеном, если ей дали некорректные данные
По-моему должна. Но ведь ничего не мешает заменить exit(nDef); на соответсвующий код, не правда ли?
Правка: кстати туда также легко помещаются все специальные случаи соответсвующие спецификации но не отягощающие основной алгоритм.

#94
18:02, 29 июня 2009

>А по-твоему подпрограмма не должны вываливаться с эксепшеном, если ей дали некорректные данные
Не передавайте в подпрограммы некорректные данные :)

#95
18:58, 29 июня 2009

murder
+1, но считаю нужно сделать {$IFDEF SAFE_CODE} - к примеру в редакторе или в тех приложениях где могу быть не корректные данные.

#96
19:32, 29 июня 2009

doc.
> если да то непонятно нафига два раза бегать по строке?
> curr:=pred ( Lenght(text) ); // раз
> // loop
> while curr >= 0 do begin // два
> ...
length не бегает по строке. Длина строки хранится в области памяти под строку по отрицательному смещению

#97
19:51, 29 июня 2009

d.m.k
> Длина строки хранится в области памяти под строку по отрицательному смещению
Он производный от string? Что-то сомнительно, в вобщем случае происхождение нуль-терм строки может быть любым.

#98
20:33, 29 июня 2009

doc.
мы же про делфи говорим?
Length() берет как парметр строки или дин-массивы, что внутри суть одно и то же
в делфи не short-string это всегда указатель на кусок памяти, в котором лежат:

refcount строки
length строки
символы строки
NULL

указатель (перменная типа string/WideString/AnsiString) указывает сразу на 1й символ. По отрицательному смещению можно обратиться к рефкаунту и длине. Все это компилятор считает/учитывает сам

строка в делфе - это строка copy on write.

есть очень редкие, и очень специфические случаи с хаками всякими, кгода такая строка может "потечь"

#99
20:48, 29 июня 2009

d.m.k
> мы же про делфи говорим?
Да но, на сколько я понимаю, именно PChar это галимый аналог char*, к тому же PChar используется при работе с импортируемыми функциями WinApi, например.

Короче, сделал небольшой пример и посмотрел как оно все сделано: Обычная сишная строка с обычным поиском нуля.
Единственно, там раскрученный while на четыре байта.

#100
21:25, 29 июня 2009

d.m.k
> length не бегает по строке. Длина строки хранится в области памяти под строку
> по отрицательному смещению

У него там была не строка, а пичар.

#101
0:05, 30 июня 2009

entryway
> У него там была не строка, а пичар.
вот этого я как раз не заметил, думал что string

doc.
> Да но, на сколько я понимаю, именно PChar это галимый аналог char*, к тому же
> PChar используется при работе с импортируемыми функциями WinApi, например.
с PChar все верно

когда идет конверт из PChar в string там юзается while (*S) {S++}

#102
0:47, 30 июня 2009

d.m.k
> когда идет конверт из PChar в string там юзается while (*S) {S++}
так там речь о PChar и шла.

Страницы: 1 2 3 4 5 6 7
ПрограммированиеФорумОбщее

Тема в архиве.