Метод и вызовы подпрограммы не являются бесплатными в 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%, если Вы не делаете что-то специфическое.
Если под словом «карта» вы подразумеваете «хеш-таблицу», вы можете заменить ее общим 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).
JCL реализует TAnsiStrings и TAnsiStringList в модуле JclAnsiStrings.
Должны ли эти подсистемы оставаться ответными, или просто то, как они взаимодействуют с внешним миром (RS232, текстовые файлы и т. д. ...) ? Как и в случае с C #, я рассматриваю строки в Delphi 2009 как просто строки и беспокоюсь о преобразованиях только тогда, когда они нужны кому-то другому.
Это также поможет избежать непреднамеренных неявных преобразований в вашем коде и при вызове методов Windows API, улучшая производительность.
Вы можете изменить классы TStrings и TStringList в Delphi 2007 (или более ранней версии) и переименовать их в TAnsiStrings и TAnsiStringList. Вы должны обнаружить, что это очень простая модификация, которая даст вам нужные классы.
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 в качестве кодовой страницы, чтобы весь существующий код работал без изменений.