标签: microbenchmark

为什么这个C++程序在Windows上比Linux慢?

考虑以下程序:

#define _FILE_OFFSET_BITS 64   // Allow large files.
#define REVISION "POSIX Revision #9"

#include <iostream>
#include <cstdio>
#include <ctime>

const int block_size = 1024 * 1024;
const char block[block_size] = {};

int main()
{
    std::cout << REVISION << std::endl;  

    std::time_t t0 = time(NULL);

    std::cout << "Open: 'BigFile.bin'" << std::endl;
    FILE * file;
    file = fopen("BigFile.bin", "wb");
    if (file != NULL)
    {
        std::cout << "Opened. Writing..." << std::endl;
        for (int n=0; n<4096; n++)
        {
            size_t written = fwrite(block, 1, block_size, file); …
Run Code Online (Sandbox Code Playgroud)

c++ windows io microbenchmark

6
推荐指数
1
解决办法
630
查看次数

打印树有4个节点(简单森林)用于检查基准

我使用实施实验OOP语言和现在的基准垃圾收集存储性能基准测试.现在我想检查/打印下面的小深度基准(n = 2,3,4,..).

通过该buildTreeDepth方法生成树(具有4个子节点的林).代码如下:

import java.util.Arrays;

public final class StorageSimple {

    private int count;
    private int seed = 74755;

    public int randomNext() {
        seed = ((seed * 1309) + 13849) & 65535;
        return seed;
    }

    private Object buildTreeDepth(final int depth) {
        count++;
        if (depth == 1) {
            return new Object[randomNext() % 10 + 1];
        } else {
            Object[] arr = new Object[4];
            Arrays.setAll(arr, v -> buildTreeDepth(depth - 1));
            return arr;
        }
    }

    public Object benchmark() { …
Run Code Online (Sandbox Code Playgroud)

java tree benchmarking microbenchmark

6
推荐指数
1
解决办法
135
查看次数

Julia中基准和时间宏之间的差异

我最近发现两个宏之间存在巨大差异:@benchmark和@time在内存分配信息和时间方面.例如:

@benchmark quadgk(x -> x, 0., 1.)
BenchmarkTools.Trial: 
memory estimate:  560 bytes
allocs estimate:  17
--------------
minimum time:     575.890 ns (0.00% GC)
median time:      595.049 ns (0.00% GC)
mean time:        787.248 ns (22.15% GC)
maximum time:     41.578 ?s (97.60% GC)
--------------
samples:          10000
evals/sample:     182

@time quadgk(x -> x, 0., 1.)
0.234635 seconds (175.02 k allocations: 9.000 MiB)
(0.5, 0.0)
Run Code Online (Sandbox Code Playgroud)

为什么这两个例子之间有很大的不同?

macros microbenchmark julia

6
推荐指数
1
解决办法
281
查看次数

使用 R 微基准测试和 system.time 有什么区别?

我想了解 R 的微基准测试和 system.time() 之间的区别?他们如何在内部衡量函数执行时间?

performance r microbenchmark

5
推荐指数
1
解决办法
889
查看次数

intel中的TLB结构

我从 Patterson & Hennessy 书中的基本定义开始,然后按照英特尔编程参考文档了解有关 TLB 的更多信息。

从英特尔文档中,我了解了 TLB 的高级设计。例如行大小、关联性和缓存级别。但是需要详细解释 TLB 缓存如何在现代 CPU 中处理缓存未命中及其替换机制。哪些页面
从 L1 TLB移动到 L2 TLB?TLB 中的单个条目可以寻址多少页?TLB 中有多少条目?(特别是DTLB)

任何信息或参考资料都会对我有很大帮助。(如果这不是这个问题的合适论坛,请推荐合适的论坛)

谢谢你。

processor intel tlb microbenchmark

5
推荐指数
1
解决办法
3066
查看次数

为什么 CPUID + RDTSC 不可靠?

我正在尝试在 x86-64 处理器上分析执行时间的代码。我指的是这篇英特尔白皮书,并且还浏览了其他 SO 线程,讨论了在此处此处使用 RDTSCP 与 CPUID+RDTSC 的主题。

在上面提到的白皮书中,使用 CPUID+RDTSC 的方法被称为不可靠,并且也使用统计数据进行了证明。

CPUID+RDTSC 不可靠的原因可能是什么?

此外,同一白皮书中的图 1(最小值行为图)和图 2(方差行为图)中的图具有“方波”模式。什么解释了这种模式?

x86 intel microbenchmark rdtsc cpuid

5
推荐指数
1
解决办法
531
查看次数

用于基准测试的 CPU 频率应该有多稳定?

注意:问题末尾给出了详尽的系统详细信息。

我试图让我的开发机器具有非常稳定的 CPU 频率,以便我可以获得一些线性代数代码的精确基准 - 然而,它仍然显示出明显的频率波动。

我已将缩放调节器设置为performance模式:

echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
Run Code Online (Sandbox Code Playgroud)

我还锁定了C0状态中的所有内容:

sudo cpupower idle-set -D 0
Run Code Online (Sandbox Code Playgroud)

然而,使用 时i7z,我仍然观察到 CPU 频率波动 >5%。我非常感谢有关我是否应该采取进一步步骤将 CPU 频率限制为固定值,或者是否无法获得更精确的频率限制的指导。

附录:

我的处理器是 Intel Core i7-9750H:

cat /proc/cpuinfo | grep 'model name' 
model name  : Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
...
Run Code Online (Sandbox Code Playgroud)

它有 12 个逻辑 CPU 和 6 个物理核心:

lscpu -a -e
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ    MINMHZ
0   0    0      0    0:0:0:0       yes    4500.0000 800.0000
1 …
Run Code Online (Sandbox Code Playgroud)

linux cpu benchmarking microbenchmark

5
推荐指数
1
解决办法
589
查看次数

R microbenchmark:如何将相同的参数传递给评估函数?

我想评估使用不同文件类型(geotiff、二进制)或对象(RasterBrick、RasterStack)从栅格时间序列中提取数据的时间。我创建了一个函数,该函数将从栅格​​对象的随机点提取时间序列,然后使用微基准测试它。

前任。:

# read a random point from a raster stack
sample_raster <- function(stack) {
  poi <- sample(ncell(stack), 1)
  raster::extract(stack, poi)
}

# opening the data using different methods
data_stack <- stack(list.files(pattern = '3B.*tif'))
data_brick <- brick('gpm_multiband.tif')

bench <- microbenchmark(
  sample_stack = sample_raster(data_stack),
  sample_brick = sample_raster(data_brick),
  times = 10
)

boxplot(bench)

# this fails because sampled point is different
bench <- microbenchmark(
  sample_stack = sample_raster(data_stack),
  sample_brick = sample_raster(data_brick),
  times = 10,
  check = 'equal'
)
Run Code Online (Sandbox Code Playgroud)

我在此处包含了我的数据集的示例

由此,我可以看到RasterBrick上的采样比堆栈更快(R …

r microbenchmark r-raster

5
推荐指数
1
解决办法
680
查看次数

带有命令行参数的 Google 基准测试。编写我自己的主要功能?

我有一个类似的代码:

...
void benchMark(benchmark::State& state){
    maxCapacity = state.range(0);
    // set up some stuff
    for (auto _ : state){
        // time this code
    }
}

BENCHMARK(benchMark)->DenseRange(2, 10, 1);
BENCHMARK_MAIN();
Run Code Online (Sandbox Code Playgroud)

我想把它改成这样:

...
void benchMark(benchmark::State& state){
    maxCapacity = state.range(0);
    // set up some stuff
    for (auto _ : state){
        // time this code
    }
}

int main(){
    BENCHMARK(benchMark)->DenseRange(2, 10, 1);
}
Run Code Online (Sandbox Code Playgroud)

我这样做只是为了以后可以为代码提供命令行参数支持。现在这段代码编译成功,但我根本没有得到任何输出。我猜代码甚至没有运行。第一个代码需要 5 分钟才能完成,但第二个代码几乎立即完成执行。我究竟做错了什么?

任何帮助都会很棒。谢谢..

编辑:

由于我无法分享完整的代码,这里有一个最小的可重现示例:

#include <iostream>
#include <benchmark/benchmark.h>
using namespace std;

void pointQuery(int maxCapacity){
    long sum = 0;
    for(int i=0; …
Run Code Online (Sandbox Code Playgroud)

c++ benchmarking microbenchmark google-benchmark

5
推荐指数
1
解决办法
534
查看次数

简单 for 循环中的大量时间损失

我有一个非常简单的程序来测量一个函数花费了多少时间。

#include <iostream>
#include <vector>
#include <chrono>
struct Foo
{
    void addSample(uint64_t s)
    {
    }
};

void test(const std::vector<uint64_t>& samples)
{
    uint32_t onlyCallTime = 0;
    uint32_t loopOnlyTime = 0;
    Foo stats;
    std::chrono::high_resolution_clock::time_point callStart,callEnd;
    auto start = callStart = callEnd = std::chrono::high_resolution_clock::now();
    for(auto &s : samples)
    {
        callStart = std::chrono::high_resolution_clock::now();
        loopOnlyTime += std::chrono::duration_cast<std::chrono::microseconds>(callStart-callEnd).count();
        stats.addSample(s);
        callEnd = std::chrono::high_resolution_clock::now();
        onlyCallTime += std::chrono::duration_cast<std::chrono::microseconds>(callEnd-callStart).count();
    }
    auto end = std::chrono::high_resolution_clock::now();

    std::cout << "overall duration: " << std::chrono::duration_cast<std::chrono::microseconds>(end-start).count() << std::endl;
    std::cout << "only call duration: " << …
Run Code Online (Sandbox Code Playgroud)

c++ benchmarking duration microbenchmark c++-chrono

5
推荐指数
1
解决办法
148
查看次数