我有一个关于使用本机 SQL 聚合函数和 SSIS 中提供的聚合之间的性能差异的假设(数据库会破坏 SSIS)。我想开发一个经验过程来测试它。
对于初始测试,我唯一关心的是执行速度。以后的迭代将涵盖 CPU 和内存成本。
为了实现这一点,我建立了一个小表(100M 行)并想要捕捉时间的差异。我计划通过比较 OnPreExecute 和 OnPostExecute 的时间在 SSIS 包中完成所有操作。
第一个数据流将采用以下形式,SELECT * FROM TABLE而后者将是SELECT Aggregate(col1) FROM TABLE
对比

类似的问题,但不是我想要的
为了使评估尽可能均匀,我应该
如果决定是冲洗,就dbcc freeproccache足够了还是我需要冲洗dbcc dropcleanbuffers
我有一个发送服务器发送事件的小应用程序。我想对我的应用程序进行负载测试,以便我可以对从推送消息到收到消息之间的延迟进行基准测试,以便我知道性能何时/何处出现故障。有哪些工具可以做到这一点?
基准代码:
func BenchmarkSth(b *testing.B) {
var x []int
b.ResetTimer()
for i := 0; i < b.N; i++ {
x = append(x, i)
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
BenchmarkSth-4 50000000 20.7 ns/op 40 B/op 0 allocs/op
Run Code Online (Sandbox Code Playgroud)
问题:
我想在我的应用程序中运行基准测试。那可能吗?如果是这样,我该怎么办?我一直在环顾四周,但到目前为止还没有看到任何迹象。
我试图找到可用于 Postgres DB 的不同中间件。每个人都在推荐 PgBouncer 和 PgPool II。我可以使用的其他中间件列表是什么。
我有一个带有二进制文件的项目,入口点位于./cmd/<my-project>/main.go. 我在./cmd/<my-project>/main_test.go.
现在我想从存储库根目录执行这个基准测试。我试图以go test -bench=./cmd/<my-project>/main各种交替方式(例如go test -bench=./cmd/<my-project>/main_test.go或go test -bench=./cmd/<my-project>)执行类似的操作,但我无法让它工作。
我总是得到的错误是:
can't load package: package github.com/<username>/<my-project>: no Go files in /home/<user>/go/src/github.com/<username>/<my-project>
这是真的,*.go我的项目根目录中没有文件。
我想出的只是首先切换到目录并使用`go test -bench= 运行基准测试。
然而,由于我的程序依赖于当前的工作目录,结果在很大程度上取决于能够在另一个目录而不是目录中执行它会很棒cmd/<my-project>。(如果这好不好不是问题的一部分:))
第一条评论后更新:
我让它运行,go test -bench=. /cmd/<my-project>但基准测试被执行,就好像它会在./cmd/<my-project>目录中运行一样。我注意到“正常测试”中的类似行为 - 但这对我来说在任何时候都不是问题。
因此,我的程序确实会根据当前工作目录扫描当前目录中的文件目录,这会导致仅找到两个文件 (main.go和main_test.go),其中基准测试并没有真正的帮助。
我正在寻找一种方法来访问测试函数的返回值,以便将该值包含在测试报告文件中(类似于http://doc.pytest.org/en/latest/example/simple.html#post -process-test-reports-failures)。
我想使用的代码示例:
# modified example code from http://doc.pytest.org/en/latest/example/simple.html#post-process-test-reports-failures
import pytest
import os.path
@pytest.hookimpl(tryfirst=True, hookwrapper=True)
def pytest_runtest_makereport(item, call):
# execute all other hooks to obtain the report object
outcome = yield
rep = outcome.get_result()
if rep.when == "call" and rep.passed:
mode = "a" if os.path.exists("return_values") else "w"
with open("return_values.txt", mode) as f:
# THE FOLLOWING LINE IS THE ONE I CANNOT FIGURE OUT
# HOW DO I ACCESS THE TEST FUNCTION RETURN VALUE?
return_value = item.return_value
f.write(rep.nodeid + …Run Code Online (Sandbox Code Playgroud) 我正在挖掘源代码,Base.IteratorsMD我确信Base.nextindfor CartesianIndex(in julia/base/multidimensional.jl,请参见此处https://github.com/JuliaLang/julia/blob/55e36cc308b66d3472990a06b2797f9f9154ea0a/base/multidimensional.jl#L142-L150 ) 的实现效率极低:
function Base.nextind(a::AbstractArray{<:Any,N}, i::CartesianIndex{N}) where {N}
iter = CartesianIndices(axes(a))
return CartesianIndex(inc(i.I, first(iter).I, last(iter).I))
end
Run Code Online (Sandbox Code Playgroud)
我认为CartesianIndices(...)在每次调用中创建一个新实例必须非常昂贵,因为在我的机器上CartesianIndices(...)通过 REPL调用似乎创建了所有索引。因此,我为替代实现编写了以下基准脚本mynextind:
using Base.IteratorsMD
function mynextind(a::AbstractArray{<:Any,N}, i::CartesianIndex{N}) where {N}
dims = (x.stop for x in axes(a))
return CartesianIndex(Base.IteratorsMD.inc(i.I, CartesianIndex(ones(Int64, length(dims))...).I, CartesianIndex(dims...).I))
end
function f(func, M)
c = CartesianIndex(1,1)
while true
(c = func(M, c)) == CartesianIndex(size(M)...) && break
end
end
A = rand(100,100)
@btime f(Base.nextind, A)
@btime f(mynextind, A) …Run Code Online (Sandbox Code Playgroud) 我正在使用该benchpress库运行一些相当简单的基准测试。我一直在使用bench :: Int -> IO a -> IO ()界面。但是,似乎如果我运行给定的函数n次数,第一个之后的所有运行都非常快。
作为一个简单的例子,bench 1 (seq (sum [1..100000]) (return ()))可能需要 10 秒左右。但是,bench 5 (seq (sum [1..100000]) (return ()))会产生这样的报告:
Times (ms)
min mean +/-sd median max
0.001 2.657 5.937 0.001 13.277
Percentiles (ms)
50% 0.001
66% 0.002
75% 0.002
80% 0.002
90% 13.277
95% 13.277
98% 13.277
99% 13.277
100% 13.277
Run Code Online (Sandbox Code Playgroud)
由于平均值是 2.6,我可以推断出第一次运行需要 13 秒,其他 4 秒非常快。
为什么会发生这种情况?如何确保基准测试的所有运行都具有代表性?该库还具有更细粒度的界面:benchmark :: Int -> IO a -> …
我有一个 go test 文件,我在其中编写了一个基准函数,如下所示:
func BenchmarkStuff(b *testing.B) {
for i := 0; i < b.N; i++ {
stuff()
}
}
Run Code Online (Sandbox Code Playgroud)
当我用 运行它时go test -benchtime 1x,我得到了这个:
BenchmarkStuff-6 1 847751900 ns/op
Run Code Online (Sandbox Code Playgroud)
这是什么-6意思?这似乎不必要地神秘。
benchmarking ×10
go ×4
testing ×2
haskell ×1
julia ×1
load-testing ×1
memory ×1
performance ×1
pgbouncer ×1
pgpool ×1
postgresql ×1
pytest ×1
python ×1
return ×1
return-value ×1
sql-server ×1