Vim 作者創建分支Vim9 以改進Vim 的性能
Vim 編輯器的創建者Bram Moolenaar 最初開發了 Vim 以作為 Vi 編輯器的“增強版”,而現在,他希望通過一個名為Vim9 的實驗性分支對Vim 本身進行改進。Bram Moolenaar 表示,Vim9 是Vim 的一個實驗性分支,旨在探索使Vim 腳本更好且更快執行的方式。
這也是除“彈出窗口(Popup Windows)”和“文本屬性(Text Properties)”之外,開發者呼聲最大的功能需求。
為了能更快執行Vim 腳本,Bram 思考了很多並得出如下結論:當前調用和執行函數的方式(帶有用於參數和局部變量的字典)永遠不會很快。如果能夠使速度快兩倍,那麼Vim 的性能將會有明顯的改進。畢竟調用和執行每一行函數的開銷十分高。
Bram 認為只有通過一種與舊方法類似但屬性不一樣的新方法來定義函數才能使速度變快:
- 參數只能通過名稱(name)使用,而不能通過a: dictionary 或a:000 列表的形式使用
- 局部變量在 l: dictionary 中不可用
- 解決一些影響速度的問題,例如異常處理細節
對於上面的思路,Bram 提供了概念驗證代碼。到目前為止,對於一個簡單的運行循環的Vim 腳本,Vim 需要五秒鐘的時間,Vim9 則可以在0.07 秒內運行它,與Lua 腳本的時間相同,並且比Python 更快。
let sum = 0 for i in range(1, 2999999) let sum += i endfor
how | time in sec |
---|---|
Vim old | 5.018541 |
Python | 0.369598 |
Lua | 0.078817 |
Vim new | 0.073595 |
在更相關的代碼片段中,Vim9 可以在0.19 秒內運行腳本,而Vim 的時間是0.85 秒。
let totallen = 0 for i in range(1, 100000) call setline(i, ' ' .. getline(i)) let totallen += len(getline(i)) endfor
how | time in sec |
---|---|
Vim old | 0.853752 |
Python | 0.304584 |
Lua | 0.286573 |
Vim new | 0.190276 |
關於Vim9 的具體實現思路和細節請查看其GitHub 倉庫,這些工作經過驗證有效後會被合併到Vim 中。