我正在使用Rust中的二进制序列化和反序列化,并注意到二进制反序列化比使用Java慢几个数量级.为了消除由于例如分配和开销导致的开销的可能性,我只是从每个程序中读取二进制流.每个程序从磁盘上的二进制文件读取,该文件包含一个包含输入值数量的4字节整数,以及一个8字节大端IEEE 754编码浮点数的连续块.这是Java实现:
import java.io.*;
public class ReadBinary {
public static void main(String[] args) throws Exception {
DataInputStream input = new DataInputStream(new BufferedInputStream(new FileInputStream(args[0])));
int inputLength = input.readInt();
System.out.println("input length: " + inputLength);
try {
for (int i = 0; i < inputLength; i++) {
double d = input.readDouble();
if (i == inputLength - 1) {
System.out.println(d);
}
}
} finally {
input.close()
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是Rust的实现:
fn main() {
use std::os;
use std::io::File;
use std::io::BufferedReader;
let …Run Code Online (Sandbox Code Playgroud) 在/O2(发布)模式下查看由Visual Studio(2015U2)生成的程序集时,我看到这个"手动优化"的C代码被转换回乘法:
int64_t calc(int64_t a) {
return (a << 6) + (a << 16) - a;
}
Run Code Online (Sandbox Code Playgroud)
部件:
imul rdx,qword ptr [a],1003Fh
Run Code Online (Sandbox Code Playgroud)
所以我想知道这是否真的比按照它的编写方式更快,类似于:
mov rbx,qword ptr [a]
mov rax,rbx
shl rax,6
mov rcx,rbx
shl rcx,10h
add rax,rcx
sub rax,rbx
Run Code Online (Sandbox Code Playgroud)
我总是觉得乘法总是比几个班次/加法慢?现代英特尔x86_64处理器不再是这种情况吗?
performance ×2
assembly ×1
benchmarking ×1
file-io ×1
intel ×1
java ×1
jvm ×1
jvm-hotspot ×1
rust ×1
x86-64 ×1