在 Java 中将字符串转换为 ByteBuffer
Converting a String to ByteBuffer in Java
我想将 ASCII 字符串转换为 ByteBuffer,我遇到了这两种方法:
ByteBuffer.wrap(str.getBytes(StandardCharsets.US_ASCII));
和
StandardCharsets.US_ASCII.encode(str);
它们有什么不同(也许在性能方面)?
这些会产生相同的结果吗?
getBytes
使用平台默认字符集,不一定是 ASCII。
Encodes this String into a sequence of bytes using the platform's default charset, storing the result into a new byte array.
StandardCharsets.US_ASCII.encode
实际上使用的是 ASCII。
但是,如果您使用 str.getBytes(StandardCharsets.US_ASCII)
,那么他们将在更高层次上做同样的事情。
快速查看它们的实现后,getBytes
似乎与 encode
做的事情截然不同,因此要找出哪个在性能方面更快,您必须做一个基准。
编辑:
我写了一个 JMH 基准:
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 10)
@Fork(value = 1)
public class Main {
static final String s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
public static void main (String args[]) throws IOException, RunnerException {
org.openjdk.jmh.Main.main(args);
}
@Benchmark
public void wrap(Blackhole bh) {
bh.consume(ByteBuffer.wrap(s.getBytes(StandardCharsets.US_ASCII)));
}
@Benchmark
public void encode(Blackhole bh) {
bh.consume(StandardCharsets.US_ASCII.encode(s));
}
}
这是结果:
Benchmark Mode Cnt Score Error Units
Main.encode avgt 20 2407.242 ± 28.147 ns/op
Main.wrap avgt 20 199.227 ± 4.093 ns/op
所以 wrap
快很多。
我想将 ASCII 字符串转换为 ByteBuffer,我遇到了这两种方法:
ByteBuffer.wrap(str.getBytes(StandardCharsets.US_ASCII));
和
StandardCharsets.US_ASCII.encode(str);
它们有什么不同(也许在性能方面)? 这些会产生相同的结果吗?
getBytes
使用平台默认字符集,不一定是 ASCII。
Encodes this String into a sequence of bytes using the platform's default charset, storing the result into a new byte array.
StandardCharsets.US_ASCII.encode
实际上使用的是 ASCII。
但是,如果您使用 str.getBytes(StandardCharsets.US_ASCII)
,那么他们将在更高层次上做同样的事情。
快速查看它们的实现后,getBytes
似乎与 encode
做的事情截然不同,因此要找出哪个在性能方面更快,您必须做一个基准。
编辑:
我写了一个 JMH 基准:
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 10)
@Fork(value = 1)
public class Main {
static final String s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
public static void main (String args[]) throws IOException, RunnerException {
org.openjdk.jmh.Main.main(args);
}
@Benchmark
public void wrap(Blackhole bh) {
bh.consume(ByteBuffer.wrap(s.getBytes(StandardCharsets.US_ASCII)));
}
@Benchmark
public void encode(Blackhole bh) {
bh.consume(StandardCharsets.US_ASCII.encode(s));
}
}
这是结果:
Benchmark Mode Cnt Score Error Units
Main.encode avgt 20 2407.242 ± 28.147 ns/op
Main.wrap avgt 20 199.227 ± 4.093 ns/op
所以 wrap
快很多。