資料科學家愛用程式語言Julia現在釋出了1.5版本,經過多年發展,多執行緒功能終於在這個版本,從實驗性功能進入穩定階段,另外,官方還加入了新的函式庫,也改進了建置系統。

官方在這個版本,進行了一項重要的最佳化,便是最佳化結構配置(Struct Layout)以及分配(Allocation),這個改進將能夠極大程度降低部分工作負載的堆分配。Julia中有可變和不可變兩種物件,以Struct宣告的紀錄類型是不可變物件,當開發者想要使其轉為可變,則必須使用可變結構宣告,Julia會自動為每種類型選擇記憶體配置和呼叫慣例。

官方解釋,在這個版本之前要對不可變物件的配置進行最佳化,存在許多限制,因為不可變物件指向可變物件的堆分配時,那其本身就必須要進行堆分配,而在Julia 1.5之後,任意不可變物件都可以進行堆疊分配,按值傳遞和回傳,並內聯儲存在陣列或是其他物件中,簡單來說,不可變物件參照可變值,現在變得更有效率,就像是不可變結構參照其他不可變物件一樣。

之所以這項改進很重要,是因為許多重要抽象,都只能透過將可變物件打包在結構中實作,官方表示,這項最佳化帶來的加速程度並沒有很大,是因為Julia的分配器本身就非常高效能,只是讓View物件不再需要堆分配。

從Julia 0.5開始,官方開始加入實驗性多執行緒平行運算功能,到了現在1.5版,終於成為穩定功能。Julia的平行運算能力,一直是官方的重點工作之一,每個版本官方都會增加執行緒安全性,並且持續添加新的功能,特別是在Julia 1.3,更是執行緒功能的一個里程碑,加入了可組合多執行緒的@spawn結構。

由於目前已經有許多Julia開發人員正在使用執行緒功能,而且功能本身也趨於穩定,因此官方認為,已經不適合將執行緒功能標上實驗性標籤,因此將大多數執行緒API都標記為穩定,並使@sync和SuiteSparse繫結成為執行緒安全,還加入新的語法@threads。

官方為Julia編譯器添加每模組最佳化等級功能,也就是說開發人員可以指定每個模組最佳化的等級,官方提到,編譯時間和執行時間是一個權衡,為了讓初始使用體驗更好,他們預設最佳化等級為-O2,而這和gcc或clang中的-O2選項差不多,但因為並非所有程式碼都對效能影響很大,而且也有越來越多Julia開發者,載入較大的套件執行繪圖,或是其他非內部循環支援的工作,為了減少這類套件編譯延遲時間,現在開發者可以指定每個模組最佳化等級,像是可將Plots.jl指定為@optlevel 1,這代表該套件將使用-O1最佳化等級,可以減少首次繪製時間約三分之一。


Advertisement

更多 iThome相關內容