我正在为C中的一些非常短的操作编写一些微基准测试代码.例如,我测量的一件事是根据传递的参数数量调用空函数需要多少个周期.
目前,我在每次操作之前和之后使用RDTSC指令进行计时,以获得CPU的循环计数.但是,我担心在第一个RDTSC之前发出的指令可能会减慢我正在测量的实际指令.我还担心在第二个RDTSC发布之前可能无法完成整个操作.
有没有人知道x86指令强制所有正在进行的指令在发出新指令之前提交?我被告知CPUID可能会这样做,但我一直无法找到任何说明的文档.
我有问题,我需要根据对象类型进行动态调度.我需要调度的类型在编译时是已知的 - 在我的例子中它们是17.
我最初的猜测是使用a Dictionary<Type, Action<Object>>进行调度并obj.GetType()用于找出适当的操作.但后来我决定使用BenchmarkDotNet来看看我是否可以做得更好以及调度查找的确切成本.贝娄是我用于基准测试的代码.
public class Program
{
private static readonly Object Value = Guid.NewGuid();
private static readonly Dictionary<Type, Action<Object>> Dictionary = new Dictionary<Type, Action<Object>>()
{
[ typeof( Byte ) ] = x => Empty( (Byte)x ),
[ typeof( Byte[] ) ] = x => Empty( (Byte[])x ),
[ typeof( SByte ) ] = x => Empty( (SByte)x ),
[ typeof( Int16 ) ] = x => Empty( (Int16)x ),
[ …Run Code Online (Sandbox Code Playgroud) 背景:
这是 R 的“微基准测试”包:https :
//cran.r-project.org/web/packages/microbenchmark/index.html
参考手册中的第一行说它是为“精确计时功能”而构建的。
与此有关的一个问题是固有的计算机时间与计算机内存的权衡。一些解决方案是内存密集型的,但 CPU 速度很快。有些是 CPU 密集型的,但内存占用非常小。
问题:
我如何以良好的分辨率同时对基准/微基准进行基准测试/微基准测试,不仅是执行时间,还包括在 R 中执行期间的内存使用?
执行Java REST服务性能测试我看到一个意外的模式:在每次调用中创建并返回相同值对象的方法比仅返回存储在类或对象字段中的值对象的另一个版本运行得更快.
码:
@POST @Path("inline") public Response inline(String s) {
return Response.status(Status.CREATED).build();
}
private static final Response RESP = Response.status(Status.CREATED).build();
@POST @Path("staticfield") public Response static(String s) {
return RESP;
}
private final Response resp = Response.status(Status.CREATED).build();
@POST @Path("field") public Response field(String s) {
return resp;
}
Run Code Online (Sandbox Code Playgroud)
字节代码:
性能(使用Apache AB,单线程,多次运行,结果一致):
环境:RHEL6 + JDK Oracle 1.7.0_60-b19 64位
有可能JVM使用本机代码优化了内联版本,但从未考虑优化其他两个,因为它们已经很小了吗?
有没有办法将函数输出microbenchmark::microbenchmark转换为数据框或矩阵?
例如
v <- rnorm(100)
m <- microbenchmark(mean(v), sum(v))
Run Code Online (Sandbox Code Playgroud)
输出
Unit: nanoseconds
expr min lq mean median uq max neval
mean(v) 6568 6979.5 9348.19 7390 7390 54600 100
sum(v) 0 1.0 353.57 411 411 8211 100
Run Code Online (Sandbox Code Playgroud)
我想稍后使用这个统计数据,所以我想把结果保存为数据框.但是as.data.frame(m)不起作用.
任何帮助赞赏.
我最近开始学习 Go,我正在尝试实现一个可以由多个 groutine 同时使用的地图。我希望能够将我的实现与简单的sync.Mutex受保护的映射或类似的东西进行比较: https://github.com/streamrail/concurrent-map/blob/master/concurrent_map.go
通过使用 Google Caliper,我认为一种幼稚的基准测试方法会导致许多不需要的优化,从而破坏实际结果。使用的基准测试是否testing.B采用了一些技术来避免这种情况(毕竟 Go 和 Caliper 都是 Google 项目)?如果有,他们是已知的吗?如果不是,那么在 Go 中进行微基准测试的最佳方法是什么?
我最近玩了一些基准测试,发现了非常有趣的结果,我现在无法解释.这是基准:
@BenchmarkMode(Mode.Throughput)
@Fork(1)
@State(Scope.Thread)
@Warmup(iterations = 10, time = 1, batchSize = 1000)
@Measurement(iterations = 10, time = 1, batchSize = 1000)
public class ArrayCopy {
@Param({"1","5","10","100", "1000"})
private int size;
private int[] ar;
@Setup
public void setup() {
ar = new int[size];
for (int i = 0; i < size; i++) {
ar[i] = i;
}
}
@Benchmark
public int[] SystemArrayCopy() {
final int length = size;
int[] result = new int[length];
System.arraycopy(ar, 0, result, 0, length);
return result; …Run Code Online (Sandbox Code Playgroud) 首先,我在 IvyBridge 上进行了以下设置,我将在注释位置插入测量有效负载代码。前 8 个字节buf存储buf自身的地址,我用它来创建循环携带依赖:
section .bss
align 64
buf: resb 64
section .text
global _start
_start:
mov rcx, 1000000000
mov qword [buf], buf
mov rax, buf
loop:
; I will insert payload here
; as is described below
dec rcx
jne loop
xor rdi, rdi
mov rax, 60
syscall
Run Code Online (Sandbox Code Playgroud)
我插入到有效载荷位置:
mov qword [rax+8], 8
mov rax, [rax]
Run Code Online (Sandbox Code Playgroud)
perf显示循环为 5.4c/iter。有点理解,因为L1d延迟是4个周期。
我颠倒了这两条指令的顺序:
mov rax, [rax]
mov qword [rax+8], 8
Run Code Online (Sandbox Code Playgroud)
结果突然变成9c/iter。我不明白为什么。因为下一次迭代的第一条指令不依赖于当前迭代的第二条指令,所以这个设置应该和 case 1 没有区别。
我也用IACA工具对这两种情况进行静态分析,但是该工具不可靠,因为两种情况预测的结果都是5.71c/iter,与实验相矛盾。 …
x86 assembly micro-optimization microbenchmark micro-architecture
我正在使用基准库来对一些代码进行基准测试。我想在一次调用实际基准代码之前调用一个设置方法,而不是每次都重复调用,以便进行多个基准方法调用。例如:
static void BM_SomeFunction(benchmark::State& state) {
// Perform setup here
for (auto _ : state) {
// This code gets timed
}
}
Run Code Online (Sandbox Code Playgroud)
正如我们所看到的,对于我指定的范围,设置代码将在这里被多次调用。我确实查看了夹具测试。但我的问题是可以不使用夹具测试来完成吗?如果是的话我们该怎么做呢?