使用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'快捷鍵)。解釋頂層的任何調用,但隻影響調用謂詞的性能,而不影響謂詞。 –