写点什么

用 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:042398

评论 1 条评论

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

数智焕新!用友BIP交出央国企价值替代新答卷

用友BIP

快速掌握YashanDB的查询优化技巧

数据库砖家

如何高效利用YashanDB数据库进行数据挖掘

数据库砖家

如何高效利用YashanDB提升数据管理能力

数据库砖家

如何高效使用YashanDB数据库的日志系统?

数据库砖家

如何评估YashanDB的长期可维护性及稳定性?

数据库砖家

对初学者来说,YashanDB数据库的学习路线图

数据库砖家

从代码审计到生态共建 解码鼎夏智能的产业跃升密钥

极客天地

“智能体”帮你的报销化繁为简,智能共享助力财务转型

用友BIP

开放YashanDB数据库的功能与特性介绍

数据库砖家

如何进行YashanDB的安全审计

数据库砖家

如何进行YashanDB数据库的安全审计

数据库砖家

如何配置YashanDB实现数据高可用架构

数据库砖家

快速构建高效数据仓库:YashanDB数据库应用指南

数据库砖家

容量规划与扩展策略:YashanDB数据库企业应用

数据库砖家

如何通过YashanDB处理非结构化数据

数据库砖家

超详细攻略:教你3分钟在华为开发者空间构建专属Agent

华为云开发者联盟

炸裂!Dify新版发布:内置MCP双向支持!

王磊

YashanDB数据库版本升级与迁移指南

数据库砖家

如何通过YashanDB减少数据冗余与重复?

数据库砖家

如何通过YashanDB实施弹性计算环境的数据管理

数据库砖家

常用YashanDB命令与操作实例

数据库砖家

快速入门YashanDB数据库自动化运维工具

数据库砖家

如何进行YashanDB系统的故障排查与恢复?

数据库砖家

如何通过YashanDB创建自定义数据报告?一步步指南

数据库砖家

如何通过YashanDB丰富企业的客户数据

数据库砖家

快速入门YashanDB数据库:安装配置全流程

数据库砖家

巧用YashanDB数据库实现海量数据快速查询

数据库砖家

如何进行YashanDB数据库性能基准测试

数据库砖家

这5种规则引擎,真香!

电子尖叫食人鱼

前端 开发

错误码502终结指南:3步根除MCP加载失败难题​​

聚客AI学院

人工智能 MCP MCP协议 MCP Server MCP头号玩家

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