问题标签 [microbenchmark]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - scala 专业化 - 使用对象而不是类会导致速度变慢?
我做了一些基准测试,结果我不知道如何解释。
简而言之,情况:
我有 2 个类对泛型数组做同样的事情(计算繁重),它们都使用专门化(@specialized
, later @spec
)。一个类的定义如下:
第二:(单例)
在第二种情况下,我的性能受到了巨大的打击。为什么会发生这种情况?(注意:目前我不太了解 Java 字节码,也不太了解 Scala 编译器内部结构。)
更多细节:
完整代码在这里:https ://github.com/magicgoose/trashbox/tree/master/sorting_tests/src/magicgoose/sorting
这是从 Java 中提取的排序算法,(几乎)自动转换为 Scala,比较操作更改为通用操作允许在没有装箱的情况下使用与原始类型的自定义比较。加上简单的基准测试(不同长度的测试,带有 JVM 预热和平均)
结果看起来像:(左列是原始 Java Arrays.sort(int[])
)
后者是内部定义object
的,它很糟糕(大约慢 4 倍)。
更新 1
我已经在有和没有 scalacoptimise
选项的情况下运行了基准测试,并且没有明显的差异(只有使用 进行较慢的编译optimise
)。
r - 对数据框中的元素对进行操作
我有两个数据框x
和weights
,其中的列是成对的。以下是示例数据框:
列yr1
和yr2
是一对,列yr3
和yr4
是另一对。使用我的实际数据,列上升到yr100
50 对列。
如果yr1
或yr2
缺失,x
我想用例如以下内容填充缺失的观察:
同样对于yr3
or yr4
:
其中 5(或 30)是列中x
对于给定元素对没有缺失的元素。第一个示例的值 2 和 3(以及第二个示例中的值 4 和 2)是weights
数据帧中给定元素对的数据帧中的对应元素x
。如果一对中的两个元素都丢失了,x
我想让它们丢失。
这是R
使用嵌套执行上述操作的代码for loops
。但是,我的实际数据集中有 2000 或 3000 行,并且嵌套for loops
现在已经运行了超过 10 个小时。
我已经意识到第三和第四个if
陈述可能是不必要的。if
如果我简单地删除这两个语句,运行此代码的时间可能会大大减少。
但是,我还提出了以下替代解决方案,它使用reshape
而不是嵌套for loops
:
在我关闭当前的 R 会话并尝试上述方法之一之前,请提出可能更有效的替代方案。我已经使用microbenchmark
了一点,但还没有尝试在这里这样做,部分原因是为每个可能的解决方案编写一个函数对我来说有点吓人。我还尝试使用apply
函数系列提出解决方案,但无法提出解决方案。
我的reshape
解决方案来自这个问题:
除了计算时间之外,我还担心可能的内存耗尽。
我努力坚持使用 base R,但会考虑使用其他选项来获得所需的输出。感谢您的任何建议。
c - 尝试微基准测试的结果不一致
我一直在尝试对 Lua 代码进行一些微基准测试,但遇到了一个非常烦人的问题:我似乎无法获得一致的结果。
示例:这是一个非常简单的 Lua 程序,它应该对一个简单的 Fibonacci 函数进行计时:
当我尝试连续运行几次时,会发生以下情况:
(这只是一个例子,为简洁起见,但代表了我所看到的那种减速曲线)
从 1.1 秒左右开始的时间最终远远超过 2 秒。我一直在做的就是坐在这里反复按上进。time
如果我将测试包装在调用中而不是使用 Lua 时钟,或者如果我让它循环几次以多花几秒钟,也会发生同样的事情;它似乎按比例减慢。如果我离开它一段时间,有时时间会倒退。有时不会(可能是因为我不知道要离开多久)。
这是在 Windows+MSYS 上。在 Ubuntu(同一台机器)上尝试这个会导致不同的模式,但仍然非常不一致和不可用的结果(例如,测试需要 2 秒,然后是 3.5 秒,然后是 4 秒,然后是 2.5 秒......)。任务管理器/顶部表明在任何一种情况下都不会在后台占用 CPU。CPU 速度切换被禁用。
我究竟做错了什么?我的机器很旧,但它不会那么坏(如果是机器的故障,我肯定会注意到它无法使用,并且每个程序每秒都变得慢得多......)。
我实际上正在尝试做的事情:
我想做的是了解解释器的实现,从 vanilla Lua 开始并对其进行调整以查看更改对解释器性能的影响。正如你所看到的,我还没有通过“建立控制”,所以我实际上还没有做过任何事情——基准方差与上面一样高,我所做的任何更改都将完全丢失在噪音。我选择 Lua 是因为虽然它是一个真实世界的程序,但它也很小且易于阅读和修改。如果有更好的基础解释器可以做到这一点,或者有一个既定的最佳方式来衡量解释器的性能,请随时在答案中添加建议。
编辑:添加C
标签是因为在使用传统 C 计时实用程序的 C 程序中也会发生同样的事情,例如:
...打印以下内容:
这表明效果不限于单独运行。我想这意味着机器或操作系统存在问题。
c - 内存的微基准
我正在尝试用 C 编写一个微型基准测试来测试内存。
我相信我的机器(Intel i5)上的缓存大小是 8MB..
有人可以建议一些逻辑来测试内存,同时确保 100% 的缓存未命中率吗?
目前,使用 memcpy,我的程序每秒对 memcpy 调用 420,782,149 次。我认为这个数字有严重问题(它击中缓存很多)
如何避免缓存?
segmentation-fault - OSUmicro 基准测试和分段错误
我有一个基于 rhel 6.1 的三节点集群
在每个节点上我有两个 CPU 和 4 个 GPU Tesla M2090/
我使用 Openmpi 1.6.1,它工作正常(系统在 GPU Linpak 版本上测试)。
我安装了 mvapich2 1.9,我也遇到了同样的问题。
我认为问题可能在这个测试中?!
库达 5.0 版
Infiniband - MEllanox。
此基准的编译是成功的,当我开始点对点仅使用 CPU(H 到 H)(本地主机和两个节点)时:
mpirun -np 2 ./osu_latency HH
它工作正常。但是当我使用 GPU 时(从 CPU 复制到 GPU 内存):
mpirun -np 2 ./osu_latency HD
程序因分段错误(11)而崩溃。
我使用以下参数从http://www.nersc.gov/assets/Trinity--NERSC-8-RFP/Benchmarks/Dec17/OMB-NERSC8.tar编译了这个基准,版本 3.7 :
--prefix=/usr/local/bench/osu --enable-cuda --with-cuda=/usr/local/cuda-5.0 --with-cuda-include=/usr/local/cuda-5.0/include - -with-cuda-libpath=/usr/local/cuda-5.0 CC=/usr/local/mpi/openmpi16/bin/mpicc
我尝试用过时的路径运行程序,但它没有效果。
问题出在哪里?预先感谢!
r - 是时候从矩阵对象中获取元素了
与这个问题类似,我运行了一个微基准来从一个大矩阵中读取单个元素。我很惊讶地看到使用行名时性能会降低多少:
我绝对需要使用行名来读取我的矩阵元素。我怎样才能提高性能?
更新
我添加了来自 Geoffrey answer 和 subset() 的基准测试结果。我不知道为什么但是子集()具有更好的只读性能([[]] 允许分配,子集()不允许):
java - 估计实现的实际(非理论)运行时复杂度
计算机科学领域的任何人都知道,理论上 HeapSort 是O(n log n)
最坏的情况,而 QuickSort 是O(n^2)
最坏的情况。然而,在实践中,一个良好实现的 QuickSort(具有良好的启发式)在每个数据集上都将优于 HeapSort。一方面,我们几乎没有观察到最坏的情况,另一方面,例如 CPU 缓存线、预取等在许多简单任务中产生了巨大的差异。虽然 QuickSort 可以处理 中的预排序数据(具有良好的启发式)O(n)
,但 HeapSort 将始终重新组织 中的数据O(n log n)
,因为它不利用现有结构。
对于我的玩具项目caliper-analyze,我最近一直在研究从基准测试结果中估计算法实际平均复杂度的方法。特别是,我尝试了 Lawson 和 Hanson 的 NNLS 拟合不同的多项式。
但是,它还不能很好地工作。有时我得到可用的结果,有时我没有。我认为进行更大的基准测试可能会有所帮助,尤其是尝试更多参数。
以下结果用于以 10% 随机性的 SAW 模式对 Double 对象进行排序。本次运行的 n 最高只有 500,因此对于实际使用来说不是很有代表性……这些数字是估计的运行时依赖于大小。输出是手工编辑和手动排序的,所以它不反映该工具当前提供的内容!
您可以看出,虽然在这种特定设置下(通常它根本无法令人满意),但结果在很大程度上与已知行为一致:冒泡排序确实成本高昂,而快速排序的良好启发式方法要好得多。但是,例如,具有三个启发式中值的 QuickSort 最终会得到一个O(n + n^2)
估计,例如,而其他 QuickSort 被估计为O(n + n log n)
所以现在我的实际问题:
- 您是否知道从基准数据执行运行时复杂性分析的算法/方法/工具,以预测哪种实现(如您在上面看到的,我有兴趣比较同一算法的不同实现!)在真实数据上表现最佳?
- 你知道这方面的科学文章吗(估计实现的平均复杂度)?
- 您知道有助于在这里获得更准确估计的稳健拟合方法吗?例如,NNLS 的正则化版本。
- 您是否知道需要多少样本才能获得合理估计的经验法则?(特别是,该工具何时应避免给出任何估计,因为它可能无论如何都不准确?)
让我再次强调,我对理论复杂性或形式分析不感兴趣。我有兴趣了解实现(理论上甚至是相同的算法)如何在真实 CPU 上的基准数据上执行......共同范围的数值因子对我来说是关键,而不是渐近行为。(不,从长远来看,这不仅仅是时间复杂度和排序。但我对索引结构和其他参数感兴趣。如果我没记错的话,caliper 也可以测量内存消耗)另外,我在java中工作。一种只调用 Matlab 内置函数的方法对我没有用,因为我并不生活在 matlab 世界中。
如果我有时间,我会尝试重新运行其中一些规模更大的基准测试,以便获得更多数据点。也许它会起作用......但我相信我可以使用更强大的回归方法来获得更好的估计,即使是从较小的数据集。另外,我想检测样本何时太小而无法进行任何预测!
c - 基准测试 - CPU 时间大于墙上时间?
我在linux上测量排序算法的cpu时间和wall time。我getrusage
用来测量 cpu 时间并clock_gettime CLOCK_MONOTONIC
获得挂墙时间。虽然我注意到 CPU 时间比挂墙时间大 - 对吗?我一直认为cpu时间必须小于wall time。我的示例结果:
c++ - 基准代码 - 我做对了吗?
我想对 C/C++ 代码进行基准测试。我想测量 CPU 时间、挂墙时间和周期/字节。我写了一些测量函数,但是周期/字节有问题。
为了获得 cpu 时间,我编写了一个函数getrusage()
,对于我使用的RUSAGE_SELF
壁时间,以获得我使用的周期/字节。clock_gettime
MONOTONIC
rdtsc
我处理大小为 1024: 的输入缓冲区char buffer[1024]
。我如何进行基准测试:
- 做一个热身阶段,简单地调用
fun2measure(args)
1000 次:
for(int i=0; i<1000; i++)
fun2measure(args);
然后,针对挂钟时间做一个实时基准测试:
`无符号长我; 双倍时间;双倍时间总计 = 3.0;// 处理 3 秒
for (timeTaken=(double)0, i=0; timeTaken <= timeTotal; timeTaken = walltime(1), i++) fun2measure(args); `
对于 cpu 时间(几乎相同):
for (timeTaken=(double)0, i=0; timeTaken <= timeTotal; timeTaken = walltime(1), i++) fun2measure(args);
但是当我想获得函数的 cpu 循环计数时,我使用这段代码:
然后,计数周期/字节:((e - s) / (i * inputsSize);
。这里inputsSize
是 1024,因为它是buffer
. 但是当我升到totalTime
10 岁时,我得到了奇怪的结果:
10 秒:
5秒:
4s:
我的问题:
- 这些结果好吗?
- 为什么当我增加时间时,我总是在 cpu 中得到 0 个周期/字节?
- 我如何测量此类基准测试的平均时间、平均值、标准偏差等统计数据?
- 我的基准测试方法 100% 可以吗?
干杯!
第一次编辑:
更改i
为后double
:
我的结果似乎还可以。所以问题#2不再是问题了:)
javascript - 根据页面中的微基准动态加载方法
我有一个想法,想知道有没有这样的东西......
页面加载后,javascript 需要遍历一长串数据。有很多方法可以在 javascript 中迭代列表,有些方法在不同的浏览器上运行得更快。通常,选择一种好的方法作为所有流行浏览器之间的折衷 - 所以可能不选择最快的方法,但在任何浏览器上都不会太慢。
是否可以在一个小列表中加载多个方法并对其进行测试,每个可能只有 20 个周期,然后为页面的其余部分动态选择该方法?
这种方法可以提高性能吗?
那里有类似的东西吗?