D2009 TStringlist ansistring

Метод и вызовы подпрограммы не являются бесплатными в Perl. Они являются относительно дорогими. Так, если Ваше профилирование оказывается расходами довольно большого блока времени выполнения в небольших методах доступа которые могли бы быть микрооптимизацией, которая стоит посмотреть на.

Однако, что Вы должны не , делают заменяет средства доступа, такие как get_color () здесь:

package Car;
# sub new {...}

sub get_color {
   my $self = shift;
   return $self->{color};
}

package main;
#...
my $color = $car->get_color();

с повреждающими инкапсуляцию прямыми доступами:

my $color = $car->{color};

можно было бы думать, что это само собой разумеется, но каждый также видит сделанный повсеместно. Вот то, что можно сделать, с помощью Класс:: XSAccessor

package Car;
# sub new {...}
use Class::XSAccessor
  getters => {
    get_color => 'color',
  },
  setters => {
    set_color => 'color',
  };

Это создает новые методы, добирается - и set_color (), которые реализованы в XS и таким образом о дважды с такой скоростью, как Ваша скрученная вручную версия. Мутаторы (т.е. "$car-> цвет ('красный')"), также доступны, как цепочечные методы.

В зависимости от Вашего приложения, это может дать Вам очень крошечное (но чрезвычайно свободный) повышение. Не ожидайте больше чем 1-2%, если Вы не делаете что-то специфическое.

16
задан Argalatyr 13 July 2009 в 18:24
поделиться

5 ответов

Если под словом «карта» вы подразумеваете «хеш-таблицу», вы можете заменить ее общим TDictionary. Попробуйте объявить что-то вроде этого:

uses
  Generics.Collections;

type
  TStringMap<T: class> = TDictionary<ansiString, T>;

Затем просто замените свои StringLists на TStringMaps правильного типа объекта. (Лучшая защита типов предоставляется бесплатно.) Кроме того, если вы хотите, чтобы словарь принадлежал объектам и освобождал их, когда вы закончите, измените его на TObjectDictionary, а при вызове конструктора передайте [doOwnsValues] в соответствующий параметр.

(Кстати, если вы собираетесь использовать TDictionary, убедитесь, что вы загрузили D2009 Update 3. В исходном выпуске были серьезные ошибки в TDictionary, которые сделали его практически непригодным для использования.)

РЕДАКТИРОВАТЬ: Если он все еще должен компилироваться под D2006, тогда вам придется немного подправить. Попробуйте что-нибудь вроде этого:

type
  TStringMap =
{$IFDEF UNICODE}
    class TDictionary<ansiString, TObject>
    (Add some basic wrapper functions here.)
    end;
{$ELSE}
    TStringList;
{$ENDIF}

Обертка не должна ' Это потребует слишком много работы, если вы изначально использовали его как карту. Вы теряете дополнительную безопасность типов в обмен на обратную совместимость, но получаете настоящую хеш-таблицу, которая выполняет поиск за время O (1).

9
ответ дан 30 November 2019 в 16:50
поделиться

JCL реализует TAnsiStrings и TAnsiStringList в модуле JclAnsiStrings.

13
ответ дан 30 November 2019 в 16:50
поделиться

Должны ли эти подсистемы оставаться ответными, или просто то, как они взаимодействуют с внешним миром (RS232, текстовые файлы и т. д. ...) ? Как и в случае с C #, я рассматриваю строки в Delphi 2009 как просто строки и беспокоюсь о преобразованиях только тогда, когда они нужны кому-то другому.

Это также поможет избежать непреднамеренных неявных преобразований в вашем коде и при вызове методов Windows API, улучшая производительность.

3
ответ дан 30 November 2019 в 16:50
поделиться

Вы можете изменить классы TStrings и TStringList в Delphi 2007 (или более ранней версии) и переименовать их в TAnsiStrings и TAnsiStringList. Вы должны обнаружить, что это очень простая модификация, которая даст вам нужные классы.

2
ответ дан 30 November 2019 в 16:50
поделиться

TStringList.LoadFromFile / SaveToFile также принимает необязательный параметр типа TEncoding, который позволяет вам использовать TStringList для хранения любого типа строки, какой вы хотите.

procedure LoadFromFile(const FileName: string; Encoding: TEncoding); overload; virtual;
procedure SaveToFile(const FileName: string; Encoding: TEncoding); overload; virtual;

Также обратите внимание, что по умолчанию TStringList использует ANSI в качестве кодовой страницы, чтобы весь существующий код работал без изменений.

9
ответ дан 30 November 2019 в 16:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: