爲了好玩,我正在做一個簡單的各種語言的OpenGL基準測試,並且我剛剛完成了一個Clojure實現。然而,它的運行速度很慢,所以我決定用VisualVM進行分析,結果我得到了一些相當奇怪的結果。從各自的Java和Clojure的版本配置文件以下是快照(兩者具有相同的渲染邏輯)爲什麼OpenGL在Clojure中的表現與在Java中表現如此不同?
注意glPopMatrix是佔用了大部分的時間在Clojure的執行功能,但是在Java實現中,glDrawArrays需要更多的時間。用於Clojure version的代碼是:
(defn render-pt [apt]
(GL11/glPopMatrix)
(GL11/glPushMatrix)
(GL11/glTranslatef (:x apt) (:y apt) (- 0 (:z apt)))
(GL11/glScalef (* (:R apt) 2) (* (:R apt) 2) (* (:R apt) 2))
(GL11/glDrawArrays GL11/GL_QUADS 0 24)
apt)
函數渲染-PT被映射到PT的陣列。
爲Java version的代碼是:
for (int i = minPt; i < numPts; i++) {
Pt pt = Pts[i];
GL11.glPopMatrix();
GL11.glPushMatrix();
GL11.glTranslatef(pt.X, pt.Y, -pt.Z);
GL11.glScalef(pt.R * 2, pt.R * 2, pt.R * 2);
GL11.glDrawArrays(GL11.GL_QUADS, 0, 24);
}
兩個功能似乎同樣給我;我正在犯一些錯誤嗎?還是我讀的配置文件錯了?
編輯:我想也許,因爲你的個人資料顯示'LazySeq'的證據,你沒有迭代所有的點;但你(用'dorun')。順便說一句,你不應該使用def來聲明局部變量,而是使用'let'。 – omiel
@omiel對於代碼的抱歉;它是Scheme實現的直接端口,它重用全局變量以避免分配。我打算在清理完性能問題後進行清理。 – LogicChains