我想跟蹤在Java應用程序中調用的groovy eval(字符串)方法的性能問題的來源。如果我執行下面的代碼;Groovy腳本eval(字符串)方法的性能問題
String pattern = "test = ['one','two','three']";
engine.eval(pattern)
它運行在幾乎沒有時間(0至1毫秒)
但是,如果我說了以下
String first = "['one','two','three']";
String pattern = "test = " + first; // "identical" String to first approach
engine.eval(pattern)
花費〜30 +毫秒運行。
更糟糕的是,經過幾千次調用後,它將高達60-70ms,儘管我對這一點的關注遠低於兩種實現之間的時間增量。
任何解釋爲什麼發生這種情況/有關如何避免這種情況的建議?我懷疑它與Java和/或Groovy編譯器有關,我已經開始研究compile()方法,但是如果有一種簡單的方法來使現有的代碼可以工作(更少的事情需要改變辦法)。
沒錯,但字符串是通過他們傳遞到EVAL時間(相當於),這就是爲什麼我懷疑這是一個編譯器或運行時優化的問題(道歉,如果這就是你說的話)... – user1251193
你如何構建引擎?你在使用JSR-223嗎?如果是這樣,看看http://groovy.codehaus.org/JSR+223+Scripting+with+Groovy和最後一段:'引擎保持默認硬引用腳本函數.'如果你使用一個常量內嵌字符串然後groovy可能在這裏優化。而串聯會導致表達式被視爲新的字符串,而不是可能導致這種差異的緩存腳本。 –