写点什么

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

评论 1 条评论

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

腾讯云实时音视频(TRTC)SDK使用体验测评

为自己带盐

dotnet 28天写作 trtc-js-sdk 12月日更

消息队列存储-mysql表

小麦🌾

架构实战营

明年的能力计划之学会咨询

将军-技术演讲力教练

全网最牛逼的华为信息中心配置命令,建议收藏!

Ethereal

网络技术 信息中心 厂商设备命令

模块二作业

黄秀明

Service Mesh 在中国工商银行的探索与实践

阿里巴巴云原生

阿里云 微服务 云原生 服务网格 金融实践

DDD领域驱动设计实战(六)-理解领域事件(Domain Event)

JavaEdge

12月日更

架构实战营 - 第 4 期 - 模块二作业

Evan

架构实战营 「架构实战营」

Dubbo-Admin 功能展示与实操解析

阿里巴巴云原生

阿里云 云原生 Dubbo-Admin 功能

React进阶(十):React 项目启动原理详解

No Silver Bullet

React 12月日更

Kotlin Maps:五个基本函数

坚果

kotlin 28天写作 12月日更

【架构实战营】模块二:知识点总结

wgl

「架构实战营」

微信朋友圈的高性能复杂度

guodongq

「架构实战营」

微信朋友圈的高性能复杂度分析

糖糖学编程

架构实战营

从甲方到乙方,如何做好混沌工程的行业化落地

阿里巴巴云原生

阿里云 云原生 混沌工程 金融行业 行业化落地

云未来、新可能 - 绿色、无处不在、可信的计算

阿里巴巴云原生

阿里云 容器 云原生 活动 KubeCON

实用机器学习笔记十九:模型验证

打工人!

人工智能 机器学习 深度学习 学习笔记 12月日更

模块二作业-朋友圈高性能复杂度分析

圈圈gor

「架构实战营」

全网最牛逼的华为NTP配置命令,建议收藏!

Ethereal

华为 ntp 网络技术

架构实战营 - 模块2 - 作业

Pyel

「架构实战营」

模块二作业

novoer

#架构实战营

从手游中的感悟

搬砖的周狮傅

游戏 日常感悟

【docker 总结】第七篇 - nodejs项目部署

Brave

Docker 12月日更

微信朋友圈高性能复杂度设计

CH

「架构实战营」

【LeetCode】找到小镇的法官Java题解

Albert

算法 LeetCode 12月日更

性能工具之stress工具使用教程(带源码说明)

zuozewei

Linux 工具 性能测试 12月日更

[Pulsar] LookUp原理

Zike Yang

Apache Pulsar 12月日更

第2周学习总结

糖糖学编程

架构实战营

阿里云消息队列 RocketMQ、Kafka 荣获金融级产品稳定性测评 “先进级” 认证

阿里巴巴云原生

阿里云 云原生 稳定性 获奖

签名验证反爬,反反爬第二篇博客,Python爬虫120例

梦想橡皮擦

12月日更

Prometheus Exporter (三十二)Varnish Exporter

耳东@Erdong

Prometheus 28天写作 exporter 12月日更 Varnish

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