专栏名称: OSC开源社区
OSChina 开源中国 官方微信账号
目录
相关文章推荐
老刘说NLP  ·  大模型应用推介:多模态RAG、语法纠错、个人 ... ·  13 小时前  
OSC开源社区  ·  虚幻引擎5.6正式发布 ·  5 天前  
程序员的那些事  ·  AI 编程工具 Windsurf 突遭 ... ·  4 天前  
程序员小灰  ·  我的第一个副业是什么? ·  5 天前  
51好读  ›  专栏  ›  OSC开源社区

Rust vs. C++:性能大比拼

OSC开源社区  · 公众号  · 程序员  · 2016-12-20 08:21

正文

请到「今天看啥」查看全文



C++:



和 Rust:



在这一点上 C++ 获胜。用 Rust 来做这些事情需要更多代码。多数使用 Rust 的人都会让这种简单的程序,因为“恐慌”而报告用法错误,虽然这样产生的输出非常难看。使用 Rust 很难放过一个 I/O 错误,只要这不会让人们习惯忽视之些错误,就不算坏事;在 Rust 中忽略错误需要很多工作。


两个程序都从命令行获得一个可选的文件名参数,并从 stdin 读取数据,用于测试转换。在标准的 Linux 系统中,words 文件保存着真实的英文单词列表,包含合适的名称、缩写和需要过滤掉的短小单词。注意这里使用 Box 擦除类型,因此可以使用 io::stdin 来代替 fs:File 句柄。奇特的 &* 用于提取隐藏在(Option -已包装)由 nth() 产生的 String 中的字符序列,因此 match 有一些能直接与文本字符串 "-" 比较的东西。


我不介意锁定 io::stdin 来获得更快的输入,但得在另一个语句中要求调用 lock() 是件奇怪的事情。


数据结构和输入设置如下,同时包括输入循环的开始部分:


C++:



Rust:


这里有一点关于 Rust 的说明。Rust 整数类型支持 count_ones()。C ++ 版本需要使用 std::bitset 的成员函数 count()(如果 bitset 算是一个 C++ 集合的话,这将是 size() 接口),因为这是在 C++中不使用非标准的编译器指令,诸如 GCC 的 __builtin_popcountl 来获得在 POPCNT 指令的唯一方法。使用 bitset 而不是 可以避免一些不必要的掩码操作。 由于在 gcc/amd64 上的最小的 bitset 是 64 位的,因此这些值更有效地存储方式是 unsigned。Rust 到目前为止还没有 bitset 的替换对象,但很幸运的是我们可以使用一个整数类型来表示所有位; 不过非常类似于 C++。


Rust sevens 和words 向量是从实际在程序中使用的方式推导出来。filter_map 调用剥离了一个 Result 包装,并丢弃任何其他文件读取错误。


下面是 输入状态机的代码:


C++:









请到「今天看啥」查看全文