使用Logtalk时,看起来我的程序用Logtalk对象执行比普通Prolog更长。我做了一个标杆纯的Prolog与logtalk对象的封装相当于下面的简单谓词的执行比较:Logtalk方法调用性能优化
%%
% plain prolog predicate
plain_prolog_simple :-
fail.
%%
% object encapsulation
:- object(logtalk_obj).
:- public([simple/0]).
simple :-
fail.
:- end_object.
这里就是我得到:
?- benchmark(plain_prolog_simple).
Number of repetitions: 500000
Total time calls: 0.33799099922180176 seconds
Average time per call: 6.759819984436035e-7 seconds
Number of calls per second: 1479329.3346604244
true.
?- benchmark(logtalk_obj::simple).
Number of repetitions: 500000
Total time calls: 2.950408935546875 seconds
Average time per call: 5.90081787109375e-6 seconds
Number of calls per second: 169468.0333888435
true.
我们可以看到logtalk_obj::simple call
慢于plain_prolog_simple
通话。 我使用SWI Prolog作为后端,我试图设置一些日志谈话标志,但没有成功。
编辑:我们可以找到标杆代码样本https://github.com/koryonik/logtalk-experiments/tree/master/benchmarks
有什么不对?为什么这种表现差异?如何优化Logtalk方法调用?
谢谢,真的。你说“为了编译源文件中的消息发送目标而使性能接近普通Prolog”,但是如何从swilgt('log talk_load/2-3'只能在编译时编译)进行编译? – Koryonik
'logtalk_load/1-2'既可以编译和加载源文件(对于'logtalk_load/1',您可以在顶层使用上面示例中的{{}/1'快捷键)。解释顶层的任何调用,但只影响调用谓词的性能,而不影响谓词。 –