我目前正在尝试学习C++ 11及其奇特的功能.具体而言,我正在寻找高效率的通用性.所以我很高兴在C++ 11中编写了一个程序来对输入文件的行进行排序以测试我的新技能.由于C++编译器的内联和良好功能,我期望在这个小例子上获得高性能.为了得到我的程序有多快的提示,我使用该qsort函数在C中攻击了完全相同的程序,因为它是原始C,没有对该函数执行内联,并且我的比较函数被调用间接并且需要做两个间接到访问char *表示字符串的指针.
然而,我对结果感到非常惊讶,C似乎比C++快4倍.在8Mb文件中,我得到以下结果:
$ g++ -O3 -std=c++11 -o sort sort.C
$ time ./sort < huge > /dev/null
real 0m0.415s
user 0m0.397s
sys 0m0.013s
$ cc -O3 -Wall -o sortc sort.c
$ time ./sortc < huge > /dev/null
real 0m0.104s
user 0m0.097s
sys 0m0.010s
$ wc -l huge
140190 huge
Run Code Online (Sandbox Code Playgroud)
请注意,我试图尽可能公平,编译选项是相同的,我的C程序(稍后转储)的行为与C++程序相同:输入行的大小没有限制,输入数量没有限制线.
我还注意到,虽然我的C程序malloc几乎每个输入行调用一次,但C++程序的每个输入行的比例为10!
以下是我用来比较的两个程序.
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <memory>
int main () {
typedef std::vector<std::string> svec;
svec …Run Code Online (Sandbox Code Playgroud) 所以我做了一些测试并得到了奇怪的结果.
码:
import numpy as np
import timeit
setup = """
import numpy as np
A = np.ones((1000,1000,3), dtype=datatype)
"""
datatypes = "np.uint8", "np.uint16", "np.uint32", "np.uint64", "np.float16", "np.float32", "np.float64"
stmt1 = """
A = A * 255
A = A / 255
A = A - 1
A = A + 1
"""
#~ np.uint8 : 1.04969205993
#~ np.uint16 : 1.19391073202
#~ np.uint32 : 1.37279821351
#~ np.uint64 : 2.99286961148
#~ np.float16 : 9.62375889588
#~ np.float32 : 0.884994368045
#~ np.float64 : …Run Code Online (Sandbox Code Playgroud) 所以,
细节
让我们假设我们有一些问题,至少有两个解决方案.我们想要实现的目标是比较它们的有效性.这该怎么做?显然,最好的答案是:做测试.我怀疑在语言特定的问题上有更好的方法(例如"PHP更快echo 'foo', 'bar'或者更快echo('foo'.'bar')").
好的,现在我们假设如果我们想测试一些代码,它等于测试一些函数.为什么?因为我们可以将该代码包装起来并传递它的上下文(如果有的话)作为它的参数.因此,我们所需要的只是拥有一些可以完成所有工作的基准功能.这是非常简单的一个:
function benchmark(callable $function, $args=null, $count=1)
{
$time = microtime(1);
for($i=0; $i<$count; $i++)
{
$result = is_array($args)?
call_user_func_array($function, $args):
call_user_func_array($function);
}
return [
'total_time' => microtime(1) - $time,
'average_time' => (microtime(1) - $time)/$count,
'count' => $count
];
}
Run Code Online (Sandbox Code Playgroud)
- 这符合我们的问题,可以用来做比较基准测试.在比较我的意思是,我们可以使用以上功能的代码X,然后代码Y并在此之后,我们可以说,代码X是Z%更快/比代码慢Y.
问题
好的,我们可以轻松测量时间.但记忆呢?我们之前的假设"如果我们想测试一些代码,它等于测试一些函数"似乎在这里不正确.为什么?因为 - 从形式上看它是真的,但如果我们将代码隐藏在函数中,那么我们将永远无法在此之后测量内存.例:
function foo($x, $y)
{
$bar = array_fill(0, $y, str_repeat('bar', …Run Code Online (Sandbox Code Playgroud) 作为最佳实践的问题,我试图确定apply()在矩阵中创建函数是否更好,或者如果通过函数简单地循环矩阵更好.我尝试了两种方式,并惊讶地发现apply()速度较慢.任务是取一个向量并将其评估为正数或负数,然后如果为正数则返回1,如果为负则返回-1.该mash()函数循环和squish()功能传递给apply()函数.
million <- as.matrix(rnorm(100000))
mash <- function(x){
for(i in 1:NROW(x))
if(x[i] > 0) {
x[i] <- 1
} else {
x[i] <- -1
}
return(x)
}
squish <- function(x){
if(x >0) {
return(1)
} else {
return(-1)
}
}
ptm <- proc.time()
loop_million <- mash(million)
proc.time() - ptm
ptm <- proc.time()
apply_million <- apply(million,1, squish)
proc.time() - ptm
Run Code Online (Sandbox Code Playgroud)
loop_million 结果:
user system elapsed
0.468 0.008 0.483
Run Code Online (Sandbox Code Playgroud)
apply_million 结果:
user system …Run Code Online (Sandbox Code Playgroud) 我正在将一个流浪汉配置者从shell转换为ansible,我想知道是否有任何选项可以显示完成每项任务所需的实际时间?
理想情况下,我想使用shell:方法和内置的yum:with_items方法来测量在yum中安装多个包之间的区别.ATM我坐在这里有一个秒表,但我需要准确的时间.
我正在尝试使用AES/GCM/NoPadding加密和解密数据.我安装了JCE Unlimited Strength Policy Files并在下面运行了(简单的)基准测试.我使用OpenSSL做了同样的事情,并且能够在我的PC上实现超过1 GB/s的加密和解密.
使用下面的基准测试,我只能在同一台PC上使用Java 8进行3 MB/s的加密和解密.知道我做错了什么吗?
public static void main(String[] args) throws Exception {
final byte[] data = new byte[64 * 1024];
final byte[] encrypted = new byte[64 * 1024];
final byte[] key = new byte[32];
final byte[] iv = new byte[12];
final Random random = new Random(1);
random.nextBytes(data);
random.nextBytes(key);
random.nextBytes(iv);
System.out.println("Benchmarking AES-256 GCM encryption for 10 seconds");
long javaEncryptInputBytes = 0;
long javaEncryptStartTime = System.currentTimeMillis();
final Cipher javaAES256 = Cipher.getInstance("AES/GCM/NoPadding");
byte[] tag …Run Code Online (Sandbox Code Playgroud) 一般来说IEnumerable<>,当我传入参数时,我倾向于使用作为类型。然而,根据 BenchmarkDotNet:
[Benchmark]
public void EnumeratingCollectionsBad()
{
var list = new List<string>();
for (int i = 0; i < 1000; i++)
{
Bad(list);
}
}
[Benchmark]
public void EnumeratingCollectionsFixed()
{
var list = new List<string>();
for (int i = 0; i < 1000; i++)
{
Fixed(list);
}
}
private static void Bad(IEnumerable<string> list)
{
foreach (var item in list)
{
}
}
private static void Fixed(List<string> list)
{
foreach (var item in list)
{
}
}
Run Code Online (Sandbox Code Playgroud)
| 方法 | 工作 … |
|---|
我不确定这是属于StackOverflow还是属于Clojure Google小组.但该小组似乎正在忙着讨论Clojure 1.2的数字改进,所以我会在这里尝试:
http://shootout.alioth.debian.org/为各种语言提供了许多性能基准.
我注意到Clojure丢失了,所以我制作了一个关于n体问题的Clojure版本.
我可以在这里找到我能够生成的最快的代码,并且对它进行基准测试似乎是说数字运算Clojure是
我对这种性能表现非常满意.
我对Clojure大师的问题是
更新
对于枪战更多的Clojure 1.1基准程序在这里,其中包括正体问题.
我只是从rake:test来到RSpec,我很难找到任何等同于rake测试:基准和/或rake测试:profile.
那么,大多数rspec人员用于性能测试的是什么?我发现了--profile,它吐了十个最慢的测试,但我希望能有一些更全面的东西.
干杯...
benchmarking ×10
performance ×5
aes-gcm ×1
ansible ×1
apache ×1
c ×1
c# ×1
c++ ×1
c++11 ×1
clojure ×1
cryptography ×1
ienumerable ×1
java-8 ×1
memory ×1
numpy ×1
php ×1
provisioning ×1
python ×1
r ×1
rspec ×1
sorting ×1
task ×1
types ×1
vagrant ×1