写点什么

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

评论 1 条评论

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

Nautilus Chain测试网迎阶段性里程碑,模块化区块链拉开新序幕

股市老人

加速44%!RT-DETR量化无损压缩优秀实战

飞桨PaddlePaddle

人工智能 百度 paddle

OneCode-流程引擎设计

codebee

Generative AI 新世界:文本生成领域论文解读

亚马逊云科技 (Amazon Web Services)

机器学习

TS接口类型

不叫猫先生

6 月 优质更文活动

C语言编程—命令行参数

芯动大师

C语言 命令行参数解析 6 月 优质更文活动

手势识别技术的挑战和未来发展

数据堂

2023-06-14:我们从二叉树的根节点 root 开始进行深度优先搜索。 在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度) 然后输出该节点的值。(如果节点的深度为 D,则其

福大大架构师每日一题

Go 算法 rust 福大大架构师每日一题

GitHub 2800颗星,支持GPT/Transformer,字节跳动这个开源项目是怎么来的?

字节跳动技术范儿

机器学习 nlp

JS中, Set为什么是带键的集合?

林十二XII

前端

深入理解Pod的核心知识

穿过生命散发芬芳

pod 6 月 优质更文活动

Spring Security6 全新写法,大变样!

江南一点雨

Java springboot springsecurity

手势识别技术及其应用

数据堂

精打细算:OptaPlanner如何帮助您找到最佳优惠券组合

PeterOne

算法 运筹优化 6 月 优质更文活动

MySQL8新特性窗口函数详解

越长大越悲伤

MySQL sql

基于STM32设计的智能灌溉控制系统

DS小龙哥

6 月 优质更文活动

以商业实践反哺开源技术跃升|2023开放原子全球开源峰会开源商业化创新发展分论坛成功举行

开放原子开源基金会

开源 开源商业化 开放原子全球开源峰会

生产环境可用的 Seata-go 1.2.0 来啦!!!

SOFAStack

Java seata 版本发布 Seata框架 Seata-go

WMS 库存系统设计

红袖添香

系统设计 供应链物流 WMS系统 库存系统

Nautilus Chain测试网迎阶段性里程碑,模块化区块链拉开新序幕

BlockChain先知

中国科学院院士梅宏:推进构建面向全球的开源生态治理体系

开放原子开源基金会

开源 开放原子 梅宏

智达方通EPM 发布5.0版本,持续赋能企业数智化管理

智达方通

EPM 智达方通 全面预算管理 智达方通EPM 企业绩效管理系统

Seata Saga 模式快速入门和最佳实践

SOFAStack

分布式 云原生 开发 seata Seata框架

当 GraphQL 遇上图数据库,便有了更方便查询数据的方式

NebulaGraph

图数据库 graphql

用Optaplanner实现云资源优化:建模详解

PeterOne

算法 后端 运筹优化 6 月 优质更文活动

ubuntu服务器安装图形化界面总结

Studying_swz

6 月 优质更文活动

对线面试官-Sychronized和ReentrantLock

派大星

Java 面试题

海纳 “千川”:得物多场景统一推荐平台

得物技术

架构模块2作业

sandywrh

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