产品战略专家梁宁确认出席AICon北京站,分享AI时代下的商业逻辑与产品需求 了解详情
写点什么

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

评论 1 条评论

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

用Queue实现Stack,Moya网络框架,Sublime列操作,网络通信协议 非阻塞网络I/O NIO 数据库架构原理 John 易筋 ARTS 打卡 Week 11

John(易筋)

ARTS 打卡计划 数据库架构原理 网络通信协议 Moya 非阻塞网络I/O

编程经典案例之函数

顿晓

函数式编程

你该知道的Docker-compose

北漂码农有话说

入门WebGL,看这一篇就够了

Geek_6y2vrc

大前端 WebGL

图解+代码|常见限流算法以及限流在单机分布式场景下的思考

yes

分布式限流 单体限流 限流算法

第九周作业

赵龙

这一周,我肝了公司的聚合代扣支付网关!

诸葛小猿

微信 支付宝 周期扣款 委托代扣 协议扣款

Docker 网络

北漂码农有话说

Docker

区块链行业发展月度新动态

CECBC

产业落地 政策扶持 差混高新技术 应用场景广泛

创业公司技术体系建设-APM

星际行者

APM

RRedis系列(八):缓存到底该如何做到高可用?

z小赵

redis 分布式系统 高并发系统设计

稳定匹配:幸福不靠等,脱单要主动

KAMI

生活 算法 方法论

架构师训练营第九周学习总结

qihuajun

N皇后问题的回溯法实现(C++)

老王同学

架构师训练营第九周作业

qihuajun

复杂事件处理简介

星际行者

分布式 流计算 CEP 复杂事件处理

这是我迄今为止读过的最有价值的技术书,却一行代码都没有

废材姑娘

第九周总结

晨光

极客时间 - 架构师培训 - 9 期作业

Damon

程序的机器级表示-算术与逻辑运算

引花眠

计算机基础

JVM垃圾回收

羽球

第九周作业

晨光

JVM 垃圾回收原理

飞雪

Python 多进程之间共享变量

AlwaysBeta

Python 进程

基于 opentracing + Jaeger 实现全链路追踪 ----理论部分

是老郭啊

全链路监控 OpenTracing Jaeger Go 语言

第九章作业

武鹏

LeetCode题解:70. 爬楼梯,DP遍历数组,JavaScript,详细注释

Lee Chen

大前端 LeetCode

速览国内主要银行区块链技术应用现状

CECBC

应用落地 区块链+金融 信任 部署与维护

Android |《看完不忘系列》之okhttp

哈利迪

android

ARTS Week10

时之虫

ARTS 打卡计划

第九周学习总结

赵龙

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