标签: benchmarking

如何对真正数据库密集型的Rails操作进行基准测试和优化?

在客户端站点的管理部分中有一个操作,例如Admin :: Analytics(我没有构建但必须维护),它通过执行几十个相当密集的数据库查询来编译站点使用情况分析.在编译分析报告时,此功能始终是应用程序性能瓶颈.但是,最近瓶颈已经变得非常糟糕,当访问时,网站会突然停止并无限期挂起.直到昨天我才有理由在服务器上运行"top"命令,但这样做我意识到Admin :: Analytics#index导致mysqld在四核,生产VPS上以高达350 +%的CPU功率旋转.

我已经下载了生产数据的新副本和生产日志.但是,当我在开发盒上本地访问Admin :: Analytics#index时,在使用生产数据时,它会在大约10-12秒内加载(并且利用我的双核CPU的~150 +%),这很遗憾.我想在mysql设置中可能会有一个突然发挥作用的差异.此外,数据库的mysqldump现在是531 MB,28天前只有336 MB.无论如何,我没有VPS上的root访问权限,所以调整mysqld性能会很麻烦,我真的很想知道这个问题的确切原因.但是,生产日志不包含信息.关于查询; 他们只是报告这些请求的长度,

我想我可以尝试提高生产中的日志级别来征求信息.关于由Admin :: Analytics#index执行的数据库查询,但同时我害怕在生产中复制这种行为,因为我不想再调用我们的主机来重新启动mysqld!此操作在其控制器中包含单个数据库请求,并在其视图中嵌入了几十个预准备语句!

您将如何进行基准测试/诊断和优化/修复此操作?!

(旁白:显然我想用Google Analytics或类似的解决方案完全取代此功能,但我需要在继续之前解决此问题.)

mysql optimization benchmarking ruby-on-rails

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

Haskell标准使用错误

以下代码命名 fib.hs

import Criterion.Main (defaultMain)
fibZ = 1:1:zipWith (+) fibZ (tail fibZ)
main = defaultMain [
         bench "fibZ 10" $ \n -> fibZ (10+n-n)
       ]
Run Code Online (Sandbox Code Playgroud)

错误

fib.hs:45:10: Not in scope: `bench'
Run Code Online (Sandbox Code Playgroud)

怎么了?我从这里借了这个例子.

benchmarking haskell package ghc haskell-criterion

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

在Laravel中找到慢速代码

是否有内置的方法来对Laravel中的慢速代码进行基准测试和追踪?

或者只是做一个cachegrind更有效?

无论页面有多简单,我刚建立的其中一个网站上的每个页面都需要1-2秒才能加载.

php benchmarking laravel laravel-4

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

Ruby数组与哈希测试的堆栈级别太深

这是我的剧本

require 'benchmark'
require 'ostruct'

Benchmark.bmbm do |x|
  n=10000
  array = n.times.map{ |i| OpenStruct.new id: i }
  hash = Hash[*(array.map{ |s| [s.id, s] }.flatten)]

  x.report('array') do
    array.find{ |s| s.id == 100}
  end
  x.report('hash') do
    hash[100]
  end
end
Run Code Online (Sandbox Code Playgroud)

为什么n=100000我得到:

stack level too deep (SystemStackError)
Run Code Online (Sandbox Code Playgroud)

不相关,但是,我是以最好的方式构建哈希?

ruby arrays benchmarking hashmap

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

在将数据插入数据库时​​,为什么`state`不比`my`快?

在转换数据库的过程中,我尝试使用最佳/最快插入.AFAIK,惯用的大量插入应该准备语句处理程序,然后迭代数据插入它.像这样的东西:

my $sql = q|INSERT INTO test.table ( value ) VALUES ( ? ) |;  
my $sth = $dbh->prepare( $sql );  
for my $val ( 1 .. 1000000 ) {
  $sth->execute( $val );
}
Run Code Online (Sandbox Code Playgroud)

我认为在state-declarator 的帮助下我可以将这个例程重构为函数,如下所示:

sub sql_state {  
  my ( $val ) = @_;
  state $sql = q|INSERT INTO test.table ( value ) VALUES ( ? ) |;  
  state $sth = $dbh->prepare( $sql );  
  $sth->execute( $val ) 
    or die "State";  
}  
Run Code Online (Sandbox Code Playgroud)

所以现在$sql在所有插入过程中初始化一次,并且还$sth准备一次,这是增强的基础.

在迁移我的数据库期间,我觉得这种改进并没有像我希望的那样给我这样的胜利.然后我发现了一篇文章 …

mysql perl benchmarking dbi

1
推荐指数
2
解决办法
123
查看次数

为什么返回元组比Python中的多个值更快?

我做了一个小测试:

In [12]: def test1():
    ...:     return 1,2,3
    ...: 

In [13]: def test2():
    ...:     return (1,2,3)
    ...: 

In [14]: %timeit a,b,c = test1()
Run Code Online (Sandbox Code Playgroud)

最慢的运行时间比最快的运行时间长66.88倍.这可能意味着正在缓存中间结果.10000000次循环,最佳3:每循环92.7 ns

In [15]: %timeit a,b,c = test2()
Run Code Online (Sandbox Code Playgroud)

最慢的运行时间比最快的时间长74.43倍.这可能意味着正在缓存中间结果.10000000次循环,最佳3:每循环80.1 ns

返回元组比返回多个值快约15%.为什么会这样?

python performance benchmarking tuples return-value

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

Julia与Matlab对特征向量计算进行基准测试

我是一个新的Julia用户,我需要尽快找到大矩阵的特征向量*.我无法让Julia以与Matlab一样快的速度运行以下示例:

朱莉娅

const j = 1000 ::Int

A = Array{Float64}(j,j)

B = Array{Float64}(j,j)

f(x) = eigvecs(x)

A = randn(j,j)

B = f(A)

@time f(A)
Run Code Online (Sandbox Code Playgroud)

输出时间:2.950973秒(12.31 k分配:76.445 MB,0.11%gc时间)

MATLAB

j = 1000;

A = randn(j,j);

tic

[v, d] = eig(A);

toc
Run Code Online (Sandbox Code Playgroud)

经过的时间是1.161133秒.

我还检查了Matlab的1个线程,使用maxNumCompThreads = 1进行比较,但它仍然提供了与之前类似的时间(1.16s).我也尝试通过运行两次预编译加速Julia,并设置blas_set_num_threads(4)但这没有帮助.

我真的很感激有关如何改进我的Julia代码的任何建议!

*(我在OSX El Capitan 10.11.6上使用Matlab 2015b和Julia 0.4.7)

benchmarking matlab eigenvector julia

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

Elixir比Ruby慢吗?

请帮助我解决有关Elixir与Ruby性能的基准问题.

我尝试在两种语言中实现相同的阶乘,而Ruby显示出比Elixir更好的结果:

# ruby_factorial_with_iterator.rb
def factorial_with_iterator(n)
  res = 1
  (1..n).each{|time| res *= time}
  res
end

p "factorial_with_iterator(200000)"
p factorial_with_iterator(200000)
Run Code Online (Sandbox Code Playgroud)

运行后:

$ time ruby ruby_factorial_with_iterator.rb
real  0m18.378s
user  0m17.348s
sys   0m0.844s
Run Code Online (Sandbox Code Playgroud)

和两个Elixir例子:

# elixir_factorial_with_iterator.exs
defmodule FactorialWithIterator do
  def of(n) do
    Enum.reduce(1..n, 1, &*/2)
  end
end

IO.puts "Factorial of 200000: "
IO.puts FactorialWithIterator.of(200000)
Run Code Online (Sandbox Code Playgroud)

运行后:

$ time elixir elixir_factorial_with_iterator.exs
real  1m1.735s
user  1m1.556s
sys   0m0.104s
Run Code Online (Sandbox Code Playgroud)

另一个例子:

# elixir_factorial_with_recursion.exs
defmodule FactorialWithRecursion do
  def of(0), do: 1
  def of(n) when n > 0 do
    n …
Run Code Online (Sandbox Code Playgroud)

ruby performance benchmarking compare elixir

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

如何在每个文件的基础上执行`货物工作台?

我正在解决Project Euler问题,我将每个问题都放在另一个文件中.当我尝试针对每个问题采用不同的方法时,我会在其各自的文件中为每个问题创建一系列基准.

我的目录结构如下:

euler/
    Cargo.lock
    Cargo.toml
    README.md
    src/
        main.rs
        p001.rs
        p002.rs
        ...etc.
Run Code Online (Sandbox Code Playgroud)

内容main.rs是:

#![feature(test)]

extern crate primes;
extern crate test;

mod p001;
mod p002;
// ... etc

fn main() {}
Run Code Online (Sandbox Code Playgroud)

当我运行时cargo bench,它会为我项目中的每个文件运行基准测试:

$ cargo bench
    Finished release [optimized] target(s) in 0.02 secs
     Running target/release/deps/euler_rust-5be87dff38a04da2

running 11 tests
test p001::bench_fold_sum                     ... bench:      12,955 ns/iter (+/- 13,501)
test p001::bench_for_sum                      ... bench:      11,385 ns/iter (+/- 7,383)
test p002::bench_for_sum                      ... bench:         270 ns/iter (+/- 90)
test p002::bench_takewhile_filter_mutable_sum ... …
Run Code Online (Sandbox Code Playgroud)

benchmarking rust rust-cargo

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

为什么通过std :: vector进行迭代比通过std :: array进行迭代要快?

我最近问了一个问题: 为什么迭代std :: array比迭代std :: vector快得多?

正如人们很快指出的那样,我的基准测试存在许多缺陷。因此,当我尝试确定基准时,我注意到这std::vector并不慢std::array,实际上,情况恰恰相反。

#include <vector>
#include <array>
#include <stdio.h>
#include <chrono>

using namespace std;

constexpr int n = 100'000'000;
vector<int> v(n);
//array<int, n> v;

int main()
{
    int res = 0;
    auto start = chrono::steady_clock::now();
    for(int x : v)
        res += x;
    auto end = chrono::steady_clock::now();
    auto diff = end - start;
    double elapsed =
        std::chrono::duration_cast<
            std::chrono::duration<double, std::milli>
        >(end - start).count();
    printf("result: %d\ntime: %f\n", res, elapsed);
}
Run Code Online (Sandbox Code Playgroud)

我尝试从以前的基准进行改进的事情:

  • 确保使用了结果,因此整个循环没有得到优化
  • 使用-O3标志速度 …

c++ performance benchmarking

1
推荐指数
2
解决办法
156
查看次数