вот более осмысленный тест - полиморфизм, 2 разных виртуальных реализации vs вызов через указатель на функцию
Код: Выделить всё
program Project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes
{ you can add units after this },sysutils;
type
TParamType=Integer;
TMyBaseClass=class
function test(TestImpl:Boolean;param:TParamType):TParamType;virtual;abstract;
end;
TMyClass1=class (TMyBaseClass)
function test(TestImpl:Boolean;param:TParamType):TParamType;override;
end;
TMyClass2=class (TMyBaseClass)
function test(TestImpl:Boolean;param:TParamType):TParamType;override;
end;
TTestFunc=function(TestImpl:Boolean;param:TParamType):TParamType;
function TMyClass1.test(TestImpl:Boolean;param:TParamType):TParamType;
begin
If TestImpl then
begin
write('TMyClass1.test');
end
else
result:=param + 1;
end;
function TMyClass2.test(TestImpl:Boolean;param:TParamType):TParamType;
begin
If TestImpl then
begin
write('TMyClass2.test');
end
else
result:=param + 1;
end;
function test(TestImpl:Boolean;param:TParamType):TParamType;
begin
If TestImpl then
begin
write('function test');
end
else
result:=param + 1;
end;
const
cyclecount=maxint;
var i,r:TParamType;
time:TTime;
myFunc:TTestFunc;
MyClass:TMyBaseClass;
MyImpl1:TMyClass1;
MyImpl2:TMyClass2;
begin
MyImpl1:=TMyClass1.create;
MyImpl2:=TMyClass2.create;
myFunc:=@test;
time:=now;
for i:=0 to cyclecount do
r:=myFunc(false,i);
myFunc(true,0);
writeln(' x ',cyclecount,' = ',round((now-time)*10e7),'msec');
MyClass:=MyImpl1;
time:=now;
for i:=0 to cyclecount do
r:=MyClass.test(false,i);
MyClass.test(true,0);
writeln(' x ',cyclecount,' = ',round((now-time)*10e7),'msec');
MyClass:=MyImpl2;
time:=now;
for i:=0 to cyclecount do
r:=MyClass.test(false,i);
MyClass.test(true,0);
writeln(' x ',cyclecount,' = ',round((now-time)*10e7),'msec');
readln;
end.
вывод с включенной максимальной оптимизацией
function test x 2147483647 = 6941msec
TMyClass1.test x 2147483647 = 6926msec
TMyClass2.test x 2147483647 = 6946msec
Хз, толи компилер понял что от "виртуальности" можно уйти, толи настолько соптимизировал, НО РАЗНИЦЫ НИКАКОЙ НЕТ
вывод без оптимизации
function test x 2147483647 = 9285msec
TMyClass1.test x 2147483647 = 9667msec
TMyClass2.test x 2147483647 = 9669msec
ГДЕ РАЗНИЦА В РАЗЫ? Вижу только ~4%.
MiniQ>>Способы вызова методов - ловля блох.
Ага, ловля блох которых нет
Основная тема топика с отрисовкой интерфейса какраз не пересекается))