用 Python 重寫了 C 語言實現的 Solaris 命令,代碼減少90%而性能提升17倍

/usr/bin/listusers命令中,我修復了一個內存分配的錯誤,這個錯誤在該命令轉爲64位時會引起一些問題。在修復這個錯誤之後,我決定研究一下這段古老的C代碼是否能在轉換爲Python實現後得到一些改進。

這段C代碼大約有800行,但從1988年後就基本沒有動過了,在編寫這段代碼的那個年代,用戶數還相當少,很有可能用戶信息是在/etc/passwd這個本地文件中或者在小型的NIS服務器上。

經過一番研究後,我發現listusers的算法基本上就是一些簡單的集合操作。listusers命令不帶參數,它只是把排好序的用戶列表輸出到域名服務裏,命令後的-l和-g選項用來過濾用戶和組所在的列表。

我用Python3重寫了listusers,代碼行數幾乎只有原來代碼的1/10——由於Python本身包含了集合操作,而C版本代碼自己使用鏈表實現了集合操作。

但是Python應該會更慢一些嗎?結果證明不是。實際上,在我的數據庫裏(數據庫裏包含超過10萬的用戶)測試,它反而快了17倍。而且,我還肯定,當Python版本知道命令使用了-l和-g選項做過濾時,它不會把整個域名服務內容同時放進內存裏。

改成Python後,我發現之前一個長期存在的bug變得很容易修復,即listusers不能正確地擴展嵌套組的問題。之前用C代碼編寫時,並不存在嵌套組這個概念,但是,使用LDAP,嵌套組就可以實現了。

改成Python後,我還發現這100行Python3版本的代碼將會很容易向前維護——儘管我希望listusers不需要再有什麼更新,因爲它的原有代碼都已歷經了好幾十年!

原文鏈接:

https://blogs.oracle.com/solaris/reimplementing-a-solaris-in-python-gained-17x-performance-improvement-from-c

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章