Чего мне не хватает в FreePascal
Модератор: Модераторы
-
Шурик Сетевой
- новенький
- Сообщения: 11
- Зарегистрирован: 05.03.2009 20:42:42
Насчет хешей (ака ассоциативных массивов): если кому надо, гляньте модуль Containers (Uses contnrs), там должна быть рабочая реализация.
http://www.freepascal.org/docs-html/fcl ... dex-4.html
http://www.freepascal.org/docs-html/fcl ... dex-4.html
Си создавался и поддерживался как голый функционал, в нём всё подчинено сделать так, чтобы достигнуть цели некими минимальными средствами. Поэтому, с точки зрения эстетики, Си - мерзок, некрасив.
Послушаешь вот таких дерзких хлопчиков, и ощущение, будто на паскале как не выделывайся, только картину чудную можно написать.
Вообще, не все же пишут класику. Кто-то среди нас и Пикасо. Если мне надо малевать, то я должен иметь возможность.
Хотя, я не думаю, что из-за того, что любая операция возвращает значение есть проблемы с пониманием кода.
Нет! Этой бесовщины не надо!Такие конструкции тоже запрещают, когда пишут софт для авиационного прибора!
Да, прекрасно, что запрещают для авиационного прибора. И если это будет в паскале, то будут и дальше запрещать. Потом, какое мне, да и 99.999999% программистов дело до авиационного прибора? Не, ну правда?
Шурик Сетевой писал(а):Насчет хешей (ака ассоциативных массивов): если кому надо, гляньте модуль Containers (Uses contnrs), там должна быть рабочая реализация.
http://www.freepascal.org/docs-html/fcl ... dex-4.html
Реализация хеш таблиц там медленная, хотя и не самая медленная из тех что я видел.
Для меня в хеш таблице главное:
1. Поиск должен быть максимально быстрым, даже в ущерб памяти и другим операциям
2. Операция добавления также должна быть максимально быстрой
3. Хеш таблица должна быть динамический
4. Операция очищения хеш таблицы от значений также должна быть довольно быстрой
5. У хеш таблицы должен быть метод ее клонирования
c := a := b;
Точно бесовская конструкция.
А против множеств значит возражений нет? Никто не попинал даже
vada писал(а):А против множеств значит возражений нет? Никто не попинал даже
Ну а как ты представляешь себе реализацию?
SizeOf(set of char) = 32.
Для word должно быть:
SizeOf(set of word) = 8K
Про Integer вообще помолчим...
Да, ассоциативных массивов по примеру PHP действительно не хватает, типа
Это немного не то.
Код: Выделить всё
$data = array ('n1' => array('name' => 'main_base', 'pass'=>'123', 'n2' => array('name' => 'second_base', 'pass'=>'678'));Насчет хешей (ака ассоциативных массивов): если кому надо, гляньте модуль Containers (Uses contnrs), там должна быть рабочая реализация.
http://www.freepascal.org/docs-html/fcl ... dex-4.html
Это немного не то.
v-t-l писал(а):http://www.aleprojects.com/ru/doc/talearray, он же на SourceForge http://sourceforge.net/projects/talearray/
http://www.lazarus.freepascal.org/index.php?topic=12077.0
Это не хеш таблица, по исходникам видно, ведь весь профит хеш таблиц в мгновенном поиске ключей, даже если у вас будет 1 млн элементов. Если будете искать ключ перебором, медленнее будет примерно в 1000-10000 раз по-сравнению с хеш таблицей, бинарный поиск будет быстрее обычного перебора, но ему все равно очень далеко до хеш-таблиц. И если вы возьмете тот класс и хеш-массив из пхп и сравните их скорость, то увидите что в пхп ассоциативный массив будет работать нааааамного быстрее TArray < .. >, единственное потребление памяти будет меньше у TArray.
devels
Что то я сильно сомневаюсь, что ассоциативный массив на PHP покажет более высокую скорость чем двоичная коллекция на Delphi. Вы производили замеры? Позвольте поинтересоваться цифрами.
Что то я сильно сомневаюсь, что ассоциативный массив на PHP покажет более высокую скорость чем двоичная коллекция на Delphi. Вы производили замеры? Позвольте поинтересоваться цифрами.
Max Rusov писал(а):devels
Что то я сильно сомневаюсь, что ассоциативный массив на PHP покажет более высокую скорость чем двоичная коллекция на Delphi. Вы производили замеры? Позвольте поинтересоваться цифрами.
Я делал замеры, и еще не находил ни одну хеш-таблицу реализованную на fpc/delphi, которая бы работала быстрее чем в пхп (в плане добавления и поиска). Если делать дерево, тогда операция добавления/удаления будет намного медленнее чем у хеш-таблиц, но в пхп не дерево, да и в Java и других языках есть классы для хеш-таблиц, именно для хеш-таблиц. В java скорость хеш-таблиц я думаю вообще космическая, дело тут еще и в умном менеджере памяти, т.к. на выделение памяти для элементов хеш-таблицы тратится достаточно времени.
devels
Можно увидеть цифры? А в идеале - тесты?
Можно увидеть цифры? А в идеале - тесты?
Max Rusov писал(а):devels
Можно увидеть цифры? А в идеале - тесты?
Стандартная хеш-таблица из fpc, старался свести к минимуму лишние операции (IntToStr например).
Код: Выделить всё
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes,
SysUtils,
Windows,
contnrs
{ you can add units after this };
{$R *.res}
var
HashT: TFPStringHashTable;
I, J, t: Integer;
Val: AnsiString;
SAVE_INTS: Array of String[4];
begin
HashT := TFPStringHashTable.Create;
SetLength(SAVE_INTS, 1000);
for i := 0 to 1000 do
SAVE_INTS[ i ] := IntToStr(i);
t := GetTickCount;
for j := 0 to 1000 do
begin
HashT.Clear;
for i := 0 to 1000 do
HashT.Add(SAVE_INTS[i]+'x', 'x');
for i := 0 to 1000 do
val := HashT.Items[SAVE_INTS[i]+'x'];
end;
WriteLn(GetTickCount - t);
end.
Теперь код на php:
Код: Выделить всё
$t = microtime(1);
$j = 0;
while ($j++ < 1000){
$i = 0;
$arr = array();
while ($i++ < 1000)
$arr[$i.'x'] = 'x';
$i = 0;
while ($i++ < 1000)
$val = $arr[$i.'x'];
}
echo (microtime(1)-$t)*1000;
Результаты:
PHP 5.3 - 1650 mlsec
FPC 2.4.2 - 3650 mlsec (максимальные оптимизации, без дебага).
Это еще учесть что в PHP байт-код, интерпретация и т.п, т.е. доп-расходы на конкатенацию, циклы и т.п., можно отнять еще -500 mlsec.
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
А если SAVE_INTS объявить как array of ansistring?
Sergei I. Gorelkin писал(а):А если SAVE_INTS объявить как array of ansistring?
Наоборот, так меньше памяти тратится и быстрее, но там на конвертацию тратится ну максимум 5% (IntToStr).
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
Если SAVE_INTS - массив shortstring (а string[4] - это shortstring), то в они в цикле преобразуются в ansistring, причем два раза - один при добавлении, другой при чтении...
Но вообще 3.5 секунды на, грубо говоря, цикл из 2000 итераций - это какая-то совсем уж хрень. Тут нужно разбираться.
Кстати, в менеджере памяти удалось найти, хм, недоработку, из-за которой при определенных обстоятельствах его скорость падает практически в 10 раз. И очень может быть, что этот глюк проявляется и в этом тесте...
Но вообще 3.5 секунды на, грубо говоря, цикл из 2000 итераций - это какая-то совсем уж хрень. Тут нужно разбираться.
Кстати, в менеджере памяти удалось найти, хм, недоработку, из-за которой при определенных обстоятельствах его скорость падает практически в 10 раз. И очень может быть, что этот глюк проявляется и в этом тесте...
