写点什么

用 Python 重写了 C 语言实现的 Solaris 命令,代码减少 90% 而性能提升 17 倍

  • 2019-11-11
  • 本文字数:688 字

    阅读完需:约 2 分钟

用 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


2019-11-11 10:042321

评论 1 条评论

发布
用户头像
标题有点故意。不同背景不同时期写的东西,这样去比性能和代码行数就太缺乏科学精神。有点像你开着小货车一脚油门超过了一辆正常行驶的跑车,然后得出结论,你的车比跑车要快3倍的速度。
2019-11-11 13:13
回复
没有更多了
发现更多内容

报名|企业数字化转型有何“利器”?一起来揭秘

元年技术洞察

数字化转型

Eureka框架的原理

阿泽🧸

Eureka 11月月更

2022 vivo开发者大会人工智能专场:打造「1001个便利」

极客天地

费劲拿到的阿里P8架构师私藏(java岗的)JCF和JUC源码分析与实现笔记

程序知音

Java 高并发 源码刨析 java架构 后端技术

金融服务的超级App

FN0

生态 超级app 组装式应用

获奖作品《重力》超详细制作过程!建议码住!

Renderbus瑞云渲染农场

Blender制作教程

官宣!Taier1.3 新版本正式发布,新鲜功能抢先体验

袋鼠云数栈

五大模型揭秘深度学习用于时序预测的最新进展

云智慧AIOps社区

人工智能 机器学习 深度学习 算法 模型

【线上分享会回顾】九科信息董事&产品VP傅恺分享流程挖掘实践案例

九科Ninetech

无线标准802.11ac 和 802.11ax到底有什么区别?哪个更快?

wljslmz

网络技术 无线技术 802.11ac 802.11AX 11月月更

阿里云 Landing Zone 上好云伙伴联盟正式起航

云布道师

阿里云 2022云栖大会

实战指南 | Serverless 架构下的应用开发

阿里巴巴云原生

阿里云 Serverless 云原生

对于MUI的实现原理以及遮罩蒙版和numbox以及侧滑导航的事件监听的运用和实战

恒山其若陋兮

Vue 前端 11月月更

AI生命周期 | 聊聊数据准备阶段的偏见问题

澳鹏Appen

人工智能 机器学习 数据标注 数据训练 数据偏见

解决APP抓包问题【网络安全】

网络安全学海

网络安全 安全 信息安全 渗透测试 漏洞挖掘

Docker容器的使用

我是一个茶壶

容器 11月月更 docker、

数据中台选型必读(四):要想中台建的好,数据模型得做好

雨果

数据中台

中国数据中台未来会怎样?三个趋势预测为您指明方向

雨果

数据中台

Knative架构解析

穿过生命散发芬芳

Knative 11月月更

Redis的一些概念

饱饱巴士

redis 11月月更 redis梳理

2022-11微软漏洞通告

火绒安全

安全漏洞

三分钟带你了解一站式大数据平台运维管家 ChengYing 产品包制作

袋鼠云数栈

极客时间运维进阶训练营第三周作业

好吃不贵

Docker 镜像使用

我是一个茶壶

Docker 镜像 11月月更

非行稳无以致远:华为如何写好数字金融的大文章?

脑极体

【kafka运维】 kafka-consumer-groups.sh消费者组管理

石臻臻的杂货铺

kafka kafka运维 11月月更

大数据生态中的 RocketMQ 5.0

阿里巴巴云原生

阿里云 RocketMQ 云原生

袋鼠云产品功能更新报告 02 期丨有亿点点走心!

袋鼠云数栈

得物极光蓝纸箱尺寸设计实践

得物技术

算法 遗传算法 供应链 建模 运筹

MUI框架之移动端前端开发对dialog与button轮播的深入运用与实战

恒山其若陋兮

Vue 前端 11月月更

持续优化,欣欣向云 | RocketMQ Operator 0.3.0 正式发布

阿里巴巴云原生

阿里云 RocketMQ 云原生

用 Python 重写了 C 语言实现的 Solaris 命令,代码减少90%而性能提升17倍_编程语言_Darren Moffat_InfoQ精选文章