我有一个 Go 应用程序,在根目录和名为“message”的子文件夹中包含许多单元和基准测试。
我执行以下命令从根运行所有单元测试,包括消息和任何其他子文件夹中的单元测试:
go test ./...
Run Code Online (Sandbox Code Playgroud)
我想在基准测试中实现相同的目标,即运行所有测试。以下内容适用于根目录中的内容:
go test -bench .
Run Code Online (Sandbox Code Playgroud)
/messages 文件夹中的基准测试将被忽略,这是预期的。所以我从根目录运行以下命令:
go test -bench ./...
Run Code Online (Sandbox Code Playgroud)
这根本无法识别,Go 似乎执行位于根目录中的单元测试。我什至尝试在命令中指定消息文件夹,如下所示:
go test -bench ./message
Run Code Online (Sandbox Code Playgroud)
……但也失败了。目前,如果我想在消息文件夹中运行基准测试,我必须 cd 进入该文件夹并执行
go test -bench .
Run Code Online (Sandbox Code Playgroud)
像上面一样。
那么正确的做法是什么呢?我如何告诉 Go 在根文件夹和子文件夹中查找基准测试?在 -bench 标志的情况下,正则表达式 arg 如何工作?显然它与单元测试运行程序的正则表达式不同。
第一张图片中使用的记忆工具来自 Rider。据我所知,它显示了托管堆的分配。第二张图显示了 BenchmarkDotNet 的结果。
为什么 Rider 显示已进行分配,但 BenchmarkDotNet 表明未对堆进行分配?
如果我改用下面的代码示例,BenchmarkDotNet 会选择分配:
var i = new int[0];
Run Code Online (Sandbox Code Playgroud)
我有一个循环,我正在尝试与 OpenMP 有效地并行化。它涉及累积矢量流的 L2 范数,并进行缩减。这是循环:
struct vec3
{
float data[3] = {};
};
float accumulate_eta_sq_t_mass(const vec3* etas, const float* masses, const std::size_t& n)
{
auto a = 0.0;
#pragma omp parallel for simd safelen(16) reduction(+:a)
for (auto ii = std::size_t{}; ii < n; ++ii)
{
const auto& eta = etas[ii];
const auto x = static_cast<double>(eta.data[0]);
const auto y = static_cast<double>(eta.data[1]);
const auto z = static_cast<double>(eta.data[2]);
const auto m = static_cast<double>(masses[ii]);
a += (x * x + y * y + …Run Code Online (Sandbox Code Playgroud) c++ benchmarking openmp performance-testing parallelism-amdahl
我有一个在 C++ 中计算字符串编辑距离的函数:
#include <string>
#include <vector>
#include <algorithm>
size_t sed_diff(const std::string & a, const std::string & b) {
std::vector<size_t> cp(b.length() + 1);
std::vector<size_t> cc(b.length() + 1);
// Edit distance on postorder traversal.
for (int j = 0; j <= b.length(); ++j) {
cp[j] = j;
}
for (int i = 1; i <= a.length(); ++i) {
cc[0] = i;
for (int j = 1; j <= b.length(); ++j) {
unsigned int c1 = a[i - 1];
unsigned int c2 …Run Code Online (Sandbox Code Playgroud) 我认为每个 C++ 程序员都曾在某个时候听说过“虚拟函数很慢”这句话。因此,我决定将虚拟函数与常规成员函数进行基准测试。
不幸的是,我在对“低级”C++ 代码进行基准测试方面没有太多经验,并且不知道如何正确避免编译器或硬件(主要是分支预测器)优化效果。
我现在面临的问题是,当我运行基准测试(我在下面提供)时,我几乎总是得到调用虚拟函数和常规函数具有相同速度的结果,有时虚拟函数工作得更快!
这就是我使用google/benchmark库编写基准的方式:
static void BM_MemberCall(benchmark::State& state) {
Base* b = new Derived();
for ([[maybe_unused]] auto _ : state) {
benchmark::DoNotOptimize(b->Foo());
benchmark::ClobberMemory();
}
}
BENCHMARK(BM_MemberCall);
static void BM_VirtualCall(benchmark::State& state) {
Base* b = new Derived();
for ([[maybe_unused]] auto _ : state) {
benchmark::DoNotOptimize(b->VirtualFoo());
benchmark::ClobberMemory();
}
}
BENCHMARK(BM_VirtualCall);
Run Code Online (Sandbox Code Playgroud)
我的类定义如下,声明于util.h:
#pragma once
// generate 10 virtual functions
#define VFOO(NAME, ID, ...) \
__attribute__((noinline)) virtual int NAME ## ID ## _0() __VA_ARGS__; \
__attribute__((noinline)) virtual …Run Code Online (Sandbox Code Playgroud) 文件:Example1.java
public class Example1 implements Runnable {
public void run() {
for(int i = 0; i < 100000000; i++) {
int x = 5;
x = x * 4;
x = x % 3;
x = x + 9000;
x = x * 923;
}
}
public static void task() {
for(int i = 0; i < 100000000; i++) {
int x = 5;
x = x * 4;
x = x % 3;
x = x + 9000;
x …Run Code Online (Sandbox Code Playgroud) 我正在尝试对我拥有的脚本执行简单的基准测试.首先,我尝试添加如下内容:
echo 'After Checklist: '. date('h:i:s:u A') ."<br />";
Run Code Online (Sandbox Code Playgroud)
但它只是在很多时候同时打印出来 - 直到运行包含脚本才会返回不同的时间.反正有没有这样做?或类似的东西 - 我基本上只是想看看瓶颈在哪里,所以我可以提高性能.
我有多个组件与RabbitMQ连接.有些是生产者和消费者.我需要对我的系统进行基准测试/加载测试.我需要确保消费者可以处理N个消息/秒.我在互联网上做了一些搜索,但还没找到任何东西.有没有人对RabbitMQ进行基准测试有什么经验?理想情况下,我想用消息向网络发送垃圾邮件而不必创建新的生产者.
我正在寻找一些工具或Go测试包来在不同的服务器上运行一些基准测试.知道如何在我的控制台中获得一些很好的分析输出.是否可以模拟访问服务器的多个用户?
从这个测试代码中得不到输出
package tests
import(
"testing"
)
func BenchmarkMyFunc(b *testing.B) {
for i := 0; i < b.N; i++ {
testplus()
}
}
func testplus() int {
x := 1
return x + 1
}
Run Code Online (Sandbox Code Playgroud)
谢谢
我用一个简单的测试类试用了BenchmarkDotNet
public class BenchTest
{
bool First = false;
[Benchmark]
public void FirstTimeInitEffect()
{
if (First == false)
{
Console.WriteLine("First called");
First = true;
Thread.Sleep(1000);
}
else
{
Thread.Sleep(10);
}
}
}
Run Code Online (Sandbox Code Playgroud)
让它运行
static void Main(string[] args)
{
var cfg = ManualConfig.Create(DefaultConfig.Instance);
var job = new Job();
job.Accuracy.RemoveOutliers = false;
cfg.Add(new Job[] {
job
}
);
BenchmarkRunner.Run<BenchTest>(cfg);
}
Run Code Online (Sandbox Code Playgroud)
这打印了一个很好的摘要,但我在结果中缺少的是第一次调用方法FirstTimeInitEffect需要1s.我期望从一个基准工具向我展示第一个呼叫效果.我已经尝试了一个自定义配置,以防止删除异常值,但这不是技巧.我使用的工具是错误的还是超出了工具的范围?
// * Detailed results *
BenchTest.FirstTimeInitEffect: Job-LQPFTL(RemoveOutliers=False)
Runtime = Clr 4.0.30319.42000, 32bit LegacyJIT-v4.6.1586.0; GC = Concurrent Workstation
Mean = 10.8548 ms, …Run Code Online (Sandbox Code Playgroud) benchmarking ×10
c++ ×3
.net ×2
c# ×2
go ×2
allocation ×1
date ×1
java ×1
openmp ×1
optimization ×1
performance ×1
php ×1
profile ×1
rabbitmq ×1
rust ×1
testing ×1
time ×1
unit-testing ×1