我的 cabal 文件中定义了多个基准:
benchmark my-gauge-bench
type: exitcode-stdio-1.0
main-is: Main.hs
hs-source-dirs:
bench/gauge
ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -Wall -threaded -rtsopts -with-rtsopts=-N
build-depends:
QuickCheck
, base >=4.10 && <10
, bytestring
, gauge
default-language: Haskell2010
benchmark my-weigh-bench
type: exitcode-stdio-1.0
main-is: Main.hs
other-modules:
Paths_pkg_core_gen
hs-source-dirs:
bench/weigh
ghc-options: -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -Wall
build-depends:
QuickCheck
, base >=4.10 && <10
, bytestring
, weigh
Run Code Online (Sandbox Code Playgroud)
如何my-guage-bench使用 Stack 仅运行单个基准测试(如 )?
在 dart 中编写一些代码时,我最近发现使用某些对象作为映射键更简单的情况。实际上这段代码是在 Web 模式下执行的(编译为 javascript),但最终它也会在 dart VM 模式下使用。
使用对象作为映射的键会对 dart 产生显着的内存/性能影响吗?
我没有找到很多关于基准测试的资源(https://dart.dev/articles/benchmarking已失效),因此也欢迎任何指示。
我正在发现 numba 的 cuda 扩展,并查看了 CUDA 上矩阵乘法的示例实现。代码位于numba 的网站上。
\n然后我用我认为不太理想的实现对其进行了基准测试:numpy 的点函数,用于将两个 1024x1024 矩阵相乘(使用 生成randn(1024,1024))
结果:
\n如果 numpy 的算法是朴素矩阵乘法,那么它应该需要 1024^3 ~ 1e9 乘法和加法。这是每 5ms/1e9 = 5 皮秒一次操作的平均吞吐量。我的 CPU 运行频率约为 3.4 GHz,因此每个周期需要 300 皮秒。
\n所以我的问题是:numpy 的矩阵乘法如何比普通矩阵乘法快 60 倍?
\n我听说过 Strassen 的算法,其复杂度约为 N^2.8,因此每次乘法和加法需要 20 皮秒。仍然比 CPU 快 30 倍。
\n编辑:
\nfrom numba import cuda, float32\n\nTPB = 16\n\n@cuda.jit()\ndef …Run Code Online (Sandbox Code Playgroud) 我试图弄清楚为什么 Java 的 BigInteger 乘法基准始终比使用复制到我的项目的 BigInteger.java 源代码中的实例快 3 倍。使用 jmh 运行基准测试。这是一个示例输出,请注意,加法的运行效果大致相同。
\nBenchmark Mode Cnt Score Error Units\nBenchmarkTest.javaBigInteger_add thrpt 5 856062.338 \xef\xbf\xbd 34040.923 ops/s\nBenchmarkTest.sourceBigInteger_add thrpt 5 842421.746 \xef\xbf\xbd 39630.112 ops/s\nBenchmarkTest.javaBigInteger_multiply thrpt 5 525649.635 \xef\xbf\xbd 15271.083 ops/s\nBenchmarkTest.sourceBigInteger_multiply thrpt 5 133944.766 \xef\xbf\xbd 1832.857 ops/s\nRun Code Online (Sandbox Code Playgroud)\n我这样做的原因是试图将其中的一部分移植到 Kotlin,我注意到基准测试有点慢。为了看看它是否与 Kotlin 有关,我从图片中删除了它,并在纯 java 中执行了所有操作,得到了完全相同的结果。如果源代码/算法完全相同,为什么这个基准测试会有如此大的差异?
\n\n我从同事那里听说 C++ 比 Java 更快,在寻求最高性能时,特别是对于金融应用程序,这是一条必经之路。但我的观察有点不同。谁能指出我实验的失败或在讨论中添加一些科学变量?
注1:我在 C++ 编译器中使用-O3(最大优化)和-O2 。
注2:包含每种语言的简短完整源代码。您可以随意在自己的机器上运行、进行更改、得出结论并分享。
注意3:如果将两个源代码并排放在编辑器中,您将看到它们的实现是等效的。
更新:我尝试clang++过g++各种优化选项(-O2、-O3、-Os、-march=native等),它们都产生了比 Java 慢的结果。我认为此时为了使 C++ 更快,我必须深入研究生成的汇编代码并进行一些汇编编程。我想知道在编写大型实际应用程序时这种方法(汇编编程和汇编调试)有多实用。
基准测试有什么作用?
执行 1000 万次,丢弃前 100 万次进行预热,并输出平均、最短和最长时间。
对于C++我得到:(使用 -O3 和 -O2)
$ g++ --version
g++ (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
$ g++ TimeBubbleSort.cpp -o TimeBubbleSort -std=c++11 -O3
$ ./TimeBubbleSort 10000000 1000000 60
Value …Run Code Online (Sandbox Code Playgroud) 我正在尝试改进以下代码:
\n public int applyAsInt(String ipAddress) {\n var ipAddressInArray = ipAddress.split("\\\\.");\n ...\nRun Code Online (Sandbox Code Playgroud)\n所以我将正则表达式编译成静态常量:
\n private static final Pattern PATTERN_DOT = Pattern.compile(".", Pattern.LITERAL);\n\n public int applyAsInt(String ipAddress) {\n var ipAddressInArray = PATTERN_DOT.split(ipAddress);\n ...\nRun Code Online (Sandbox Code Playgroud)\n其余代码保持不变。
\n令我惊讶的是,新代码比以前的代码慢。\n以下是测试结果:
\nBenchmark (ipAddress) Mode Cnt Score Error Units\nConverterBenchmark.mkyongConverter 1.2.3.4 avgt 10 166.456 \xc2\xb1 9.087 ns/op\nConverterBenchmark.mkyongConverter 120.1.34.78 avgt 10 168.548 \xc2\xb1 2.996 ns/op\nConverterBenchmark.mkyongConverter 129.205.201.114 avgt 10 180.754 \xc2\xb1 6.891 ns/op\nConverterBenchmark.mkyong2Converter 1.2.3.4 avgt 10 253.318 \xc2\xb1 4.977 ns/op\nConverterBenchmark.mkyong2Converter 120.1.34.78 avgt 10 263.045 \xc2\xb1 8.373 ns/op\nConverterBenchmark.mkyong2Converter …Run Code Online (Sandbox Code Playgroud) 我使用Go是为了提高代码效率,但是当我使用Go读写文件时,发现它的读写效率没有Perl高。是我代码的问题还是其他原因?
\n构建输入文件:
\n# Input File:\nfor i in $(seq 1 600000) do echo SERVER$((RANDOM%800+100)),$RANDOM,$RANDOM,$RANDOM >> sample.csv done\nRun Code Online (Sandbox Code Playgroud)\n使用 Perl\xef\xbc\x9a 读写文件
\ntime cat sample.csv | perl -ne 'chomp;print"$_"' > out.txt\nRun Code Online (Sandbox Code Playgroud)\nreal 0m0.249s\nuser 0m0.083s\nsys 0m0.049s\nRun Code Online (Sandbox Code Playgroud)\n使用 Go 读写文件:
\npackage main\n\nimport (\n "bufio"\n "fmt"\n "io"\n "os"\n "strings"\n)\n\nfunc main() {\n\n filepath := "./sample.csv"\n file, err := os.OpenFile(filepath, os.O_RDWR, 0666)\n if err != nil {\n fmt.Println("Open file error!", err)\n return\n }\n defer file.Close()\n buf := bufio.NewReader(file)\n for {\n line, …Run Code Online (Sandbox Code Playgroud) 有谁知道是否有任何YCSB客户端/驱动程序可用于对VoltDB进行基准测试?甚至任何参考出版物/博客/文章/研究项目?
我们可以将TPC工作负载用于VoltDB基准测试吗?
非常感谢大家.
我在想.在Ruby中测试数组是否包含另一个数组的最快方法是什么?所以我构建了这个小基准脚本.很想听听你对比较方法的看法.你知道其他一些 - 或许更好的方法吗?
require 'benchmark'
require 'set'
a = ('a'..'z').to_a.shuffle
b = ["b","d","f"]
Benchmark.bm do |x|
x.report do
10000.times do
Set[b].subset?(a.to_set)
end
end
x.report do
10000.times do
(a & b).count == b.size
end
end
x.report do
10000.times do
(a.inject(0) {|s,i| s += b.include?(i)?1:0 } == b.size)
end
end
x.report do
10000.times do
(b - a).empty?
end
end
x.report do
10000.times do
b.all? { |o| a.include? o }
end
end
end
Run Code Online (Sandbox Code Playgroud)
结果:
user system total real
0.380000 0.010000 0.390000 ( 0.404371) …Run Code Online (Sandbox Code Playgroud) 我试图获得不同数组大小的各种排序方法的总耗用时间.我能够获得size = 100,1000,10000和100000的经过时间,但是当我尝试1000000时它只是保持运行而不给出结果(我假设1000000太大了?).有没有办法使用nanoTime获取经过的时间,它会在合理的时间内编译?任何帮助都会很棒!
我的节目:
import java.util.Random;
public class Sorting {
public static void printArray(int[] array) {
System.out.print("The Array: ");
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
}
public static void exchange(int[] array, int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
public static void selectionSort(int[] array) {
for (int fill = 0; fill < array.length - 2; fill++) {
int minPos = fill;
for …Run Code Online (Sandbox Code Playgroud)