如果我在Rust中运行这些基准测试:
#[bench]
fn bench_rnd(b: &mut Bencher) {
let mut rng = rand::weak_rng();
b.iter(|| rng.gen_range::<f64>(2.0, 100.0));
}
#[bench]
fn bench_ln(b: &mut Bencher) {
let mut rng = rand::weak_rng();
b.iter(|| rng.gen_range::<f64>(2.0, 100.0).ln());
}
Run Code Online (Sandbox Code Playgroud)
结果是:
test tests::bench_ln ... bench: 121 ns/iter (+/- 2)
test tests::bench_rnd ... bench: 6 ns/iter (+/- 0)
Run Code Online (Sandbox Code Playgroud)
每次ln通话121-6 = 115 ns .
但是Java中的相同基准:
@State(Scope.Benchmark)
public static class Rnd {
final double x = ThreadLocalRandom.current().nextDouble(2, 100);
}
@Benchmark
public double testLog(Rnd rnd) {
return Math.log(rnd.x);
}
Run Code Online (Sandbox Code Playgroud)
给我:
Benchmark …Run Code Online (Sandbox Code Playgroud) 我发现了这篇文章,但它看起来不对,因为Cell它不能保证set()锁定和锁定之间的同步get().
是否Atomic_.store(true, Ordering::Release)影响其他非原子写操作?
我试着写它AtomicPtr看起来接近Java风格,但它失败了.AtomicPtr在这种情况下,我找不到正确使用的例子.
我想分析JMH测试并查看像VisualVM中一样的调用树。但是,当我使用StackProfiler时,它为我提供了诸如此类的本机方法,这对我而言完全没有用。
....[Thread state distributions]....................................................................
59,9% TIMED_WAITING
23,0% WAITING
17,0% RUNNABLE
....[Thread state: TIMED_WAITING]...................................................................
47,3% 78,9% sun.misc.Unsafe.park
8,3% 13,8% java.lang.Thread.sleep
4,4% 7,3% java.lang.Object.wait
....[Thread state: WAITING].........................................................................
21,9% 95,1% sun.misc.Unsafe.park
1,1% 4,9% java.lang.Object.wait
....[Thread state: RUNNABLE]........................................................................
13,5% 79,0% sun.nio.ch.EPollArrayWrapper.epollWait
2,0% 11,5% java.net.SocketInputStream.socketRead0
1,0% 5,7% java.net.PlainSocketImpl.socketAccept
Run Code Online (Sandbox Code Playgroud)