Доброе время суток. Сразу оговорюсь, что с Firebird практически не работал, поэтому прошу не пинать за незнание фундаментальных понятий.
Пишу UDF библиотеку под Linux 64bit. Главным критерием является скорость выполнения ф-ций. Тестовая площадка: ArchLinux 64(на VirtualBox), Firebird 2.5.1 собранный из исходников с включением флагов оптимизации по скорости "-O2 -march=core2", библиотека так же собирается с флагами оптимизации.
В процессе разработки встал вопрос производительности. Для теста на скорость вызова UDF была создана самая минимальная ф-ция:
extern "C" int NULLFUNC(void){ return 0;}
регистрация:
DECLARE EXTERNAL FUNCTION nullfunc
RETURNS INTEGER
ENTRY_POINT 'NULLFUNC' MODULE_NAME 'my_null';
проверка:
SET STATS ON;
SET TERM ^ ;
create or alter procedure PROC1
as
declare variable I integer;
begin
i = 0;
while (i < 1000000) do
begin
nullfunc();
i = i+1;
end
end^
SET TERM ; ^
EXECUTE PROCEDURE PROC1;
на выходе:
Current memory = 1914400
Delta memory = 15016
Max memory = 2048064
Elapsed time= 2.98 sec
Cpu = 0.00 sec
Buffers = 75
Reads = 0
Writes = 0
Fetches = 23
Т.е. 3 секунды на 1 млн. итераций вызова пустой ф-ции.
Для сравнения запускал на Windows XP 64(хост система на которой виртуалка; к слову, никаким лишним софтом не загажена и работает быстро) такой же тест, только с другой ф-цией, которая дополнительно генерирует рандомное число и возвращает его в виде строки. РЕЗУЛЬТАТ: 1.36 секунды.
Как такое возможно, и что можно сделать, куда копать? Firebird дополнительно не настраивался ни на Windows, ни под Linux. Возможно, влияет то, что Linux крутится на VM, но свободного раздела (поставить его на живое железо и проверить) нет. Процессор поддерживает аппаратную виртуализацию, так что в потерю производительности из-за использования VM слабо верится.
Модератор: Пользуйтесь тегами |