我正在创建一个实用程序,用于对不同的重复查找算法进行基准测试。为了准确确定执行时间,我使用了从 here 获得的示例.它基本上是一个函数,返回自 CPU 启动以来经过的 CPU 节拍数。我不是汇编方面的专家,所以我假设/希望代码示例是正确的。
这是我的主要功能的样子。
int _tmain(int argc, _TCHAR* argv[])
{
// The size of the array that is going to be tested.
int Size = 1000000;
int * Array = GenerateRandomArray(Size);
// take a time measurement before.
__int64 TicksBefore = GetCpuClocks();
// Insert algorithm to benchmark here.
for (int i = 0; i < 100; i++)
{};
// take a time measurement afterwords.
__int64 TicksAfter = GetCpuClocks();
// calculate the amount of ticks that has passed.
__int64 TicksElapsed = TicksAfter - TicksBefore;
cout << "\nThe amount of ticks that has elapsed for this operation is: " << TicksElapsed << endl;
return 0;
}
纯粹出于好奇,我的问题是为什么每次运行的运行时间不同?如果我在我的机器上按原样运行它,我得到的时间在 850 到 900 之间,总是 10 的倍数。如果我删除 GenerateRandomArray(Size) 行,那么耗时量 会增加 到 1010 到 1200 之间!这对我来说不是火车粉碎。分布对我来说足够小,我仍然可以从中提取有值(value)的数据。
我真的很好奇为什么会这样。堆栈/堆的状态是否有影响,或者它只是系统中发生的超出我控制范围的中断?
最佳答案
任何滴答级基准测试都对现代处理器上的缓存状态极其敏感(包括 TLB、分支预测器等!)。为了获得一致的结果,您应该运行测试逻辑几次,取 t0,运行逻辑数千次甚至数百万次,然后取 t1、减法和除法。
在 3 GHz CPU 上访问主内存一次可能会花费大约 100 个周期,而缺少 TLB 虚拟地址转换等可能会访问主内存 3 或 4 次!您的大内存分配可能会迫使底层 C/C++ 运行时库通过系统调用从操作系统请求更多虚拟地址空间,这将导致两种模式切换并用操作系统逻辑和数据填充一些缓存。 您需要隔离您想要测试的内容,“预热”您的缓存,并进行大量聚合测量以获得有意义的内容。
还有一点需要注意,现代超标量“乱序”CPU 对“何时”操作在时钟方面有一个非常松散的概念。十几个操作可能在任何给定时间以不同的完整性状态挂起,有时状态会回滚十几个时钟周期,因为错误预测的分支或推测内存读取结果被另一个内核的写入无效。指令可以广泛地重新排序,默认的 RDTSC 指令获取循环计数很容易受到此影响。较新的 RDTSCP 指令是序列化的,这意味着它的顺序是强制执行的,但这实际上会使 CPU 花费几个周期的生产率才能清楚地划分出这条指令之前和之后的内容。
关于c++ - 单独运行的不同执行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23704405/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass
在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我遵循了教程http://gettingstartedwithchef.com/,第1章。我的运行list是"run_list":["recipe[apt]","recipe[phpap]"]我的phpapRecipe默认Recipeinclude_recipe"apache2"include_recipe"build-essential"include_recipe"openssl"include_recipe"mysql::client"include_recipe"mysql::server"include_recipe"php"include_recipe"php::modul
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我在用Ruby执行简单任务时遇到了一件奇怪的事情。我只想用每个方法迭代字母表,但迭代在执行中先进行:alfawit=("a".."z")puts"That'sanalphabet:\n\n#{alfawit.each{|litera|putslitera}}"这段代码的结果是:(缩写)abc⋮xyzThat'sanalphabet:a..z知道为什么它会这样工作或者我做错了什么吗?提前致谢。 最佳答案 因为您的each调用被插入到在固定字符串之前执行的字符串文字中。此外,each返回一个Enumerable,实际上您甚至打印它。试试