我用多种编程语言编写了一些实现相同功能的小程序。我比较了它们的性能和内存占用。这是我编写的测试程序之一。
两个程序读取同一个文件。该文件包含由 \t(制表符)和 \n(回车符)连接的数据。内容类似如下。
aaaa\tbbb\tccc\tddd\teee\tfff\tggg\thhh\n
aaaa\tbbb\tccc\tddd\teee\tfff\tggg\thhh\n
aaaa\tbbb\tccc\tddd\teee\tfff\tggg\thhh\n
aaaa\tbbb\tccc\tddd\teee\tfff\tggg\thhh
我创建的文件有 14 列和 63 行。这些数字可能会更改。这并不重要,因为我正在测试它。
我使用 split('\n') 获取行。然后使用 split('\t') 获取行中的字段。这是一个非常简单的反序列化过程。程序读取文件一次,然后对其进行 200,000 次反序列化。然后将时间打印到控制台。
去:
package main
import (
"fmt"
"os"
"strings"
"time"
)
type Datatable struct {
id int
rows [][]string
}
func main() {
start := time.Now()
dat, err := os.ReadFile("C:\\Temp\\test1.txt")
if err != nil {
panic("file not found")
}
str := string(dat)
count := 200_000
tables := make([]Datatable, count)
for i := 0; i < count; i++ {
table := Datatable{i, nil}
var lines []string = strings.Split(str, "\n")
table.rows = make([][]string, len(lines))
for j, l := range lines {
table.rows[j] = strings.Split(l, "\t")
}
tables[i] = table
}
end := time.Now()
elapsed := end.Sub(start)
fmt.Println("Time: ", elapsed)
var b []byte = make([]byte, 1)
os.Stdin.Read(b)
}
锈:
use std::fs;
use std::time::SystemTime;
use std::io::{self, BufRead};
struct Table<'a>{
id: usize,
rows: Vec<Vec<&'a str>>,
}
fn main() {
let start = SystemTime::now();
let str = fs::read_to_string("C:\\Temp\\test1.txt")
.expect("read_to_string: failed");
let count = 200_000;
let mut tables = Vec::with_capacity(count);
for i in 0..count {
let lines = str.split('\n');
let mut table = Table {
id : i,
rows : Vec::with_capacity(lines.size_hint().0),
};
for item in lines {
table.rows.push(item.split('\t').collect::<Vec<&str>>());
}
tables.push(table);
}
println!("Time: {}", start.elapsed().expect("elapsed: failed").as_millis());
let mut line = String::new();
let stdin = io::stdin();
stdin.lock().read_line(&mut line).expect("read_line: failed");
}
- go版本go1.24.2 windows/amd64
- rustc 1.85.1 (4eb161250 2025-03-15)
- 操作系统:Windows 11
构建命令:
go build -ldflags "-s -w"
cargo build --release
在我的电脑上结果如下:
去:
Time : 4510 milis
RAM usage: 3217 MB
锈
Time : 5845 milis
RAM usage: 3578 MB
我尽量把代码写得简单一点,大家可以直接复制粘贴试试。
Rust 代码可以运行。但它比 Go 慢,而且占用更多内存。在编写代码之前,我希望 Rust 能跑得更快。也许有什么我不知道的地方。
在 Rust 的结构体中使用数组可能会使其运行得更快。但我不确定这是否可行。我想知道的是,如何用 Rust 编写这段代码才能使其运行得更快?