我有一个实验性的库,我试图测量它的性能.为此,我写了以下内容:
struct timeval begin;
gettimeofday(&begin, NULL);
{
// Experiment!
}
struct timeval end;
gettimeofday(&end, NULL);
// Print the time it took!
std::cout << "Time: " << 100000 * (end.tv_sec - begin.tv_sec) + (end.tv_usec - begin.tv_usec) << std::endl;
Run Code Online (Sandbox Code Playgroud)
偶尔,我的结果包括负面时间,其中一些是荒谬的.例如:
Time: 226762
Time: 220222
Time: 210883
Time: -688976
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?
我有一个页面,其中包含一个 div,页面加载时必须通过 JS 调整该 div 的大小。为了做到这一点,我给它一个 760px 的“默认宽度”,然后运行以下代码:
function resizeList()
{
var wlwidth,iwidth,nwidth;
wlwidth = document.body.clientWidth - 200 - 60;
iwidth = 320;
nwidth = Math.floor(wlwidth / iwidth) * iwidth;
$('#list').css('width',nwidth);
}
$(document).ready(function(){
// if we're looking at a list, do the resize-thing, now and on window resize
if (window.location.pathname.toString().split('/')[1] == "list")
{
resizeList();
window.onresize = resizeList;
}
});
Run Code Online (Sandbox Code Playgroud)
但是,页面可能需要一段时间才能加载,因为#listdiv 包含大量图像。因此,div 只会在所有内容加载完毕后才展开以填充正确的宽度。我不能只是把它从$(document).ready函数中取出,否则它会出错,说 document.body 是未定义的。
有没有办法#list在加载所有内容之前调整div 的大小?
编辑
请参阅:http : //www.google.com/images?q=whatever
他们已经实现了我想要成功的目标。该列表在页面加载时立即正确调整大小,然后填充。您可以通过 JS 调整窗口大小并观察元素平滑移动来判断它们的大小。可悲的是,谷歌的 …
我真的找不到关于这个问题的任何有趣的东西,但我一直想知道很长一段时间以来任何编程语言中的计时器和延迟如何在低级别工作。
据我了解,CPU 会尽可能快地(取决于其时钟速度)持续执行其所有内核中的指令,并且只要有任何要执行的指令(有一个正在运行的、活动的线)。
我不认为有一种直接的方法可以在涉及实时的情况下操纵这个流程。然后我想知道动画之类的东西是如何工作的,在很多很多情况下都会遇到:
计算机(主板)有物理计时器吗?就像 CPU 有寄存器来执行其操作并在计算之间保留数据?我在互联网上没有找到任何关于它的信息。操作系统是否有一些非常复杂的编程,为所有与计时相关的事情提供最低级别的 API?
我真的很好奇答案。
我想自动调整我的代码,因此必须测量某些代码段所需的时间
auto t0 = std::chrono::high_resolution_clock::now();
section_of_code_to_be_timed(arguments);
auto dt = std::chrono::duration_cast<std::chrono::nanoseconds>
(std::chrono::high_resolution_clock::now()-t0).counts();
// ... using dt to tweak auto-tuning parameters
Run Code Online (Sandbox Code Playgroud)
我担心的是,编译器可能会重新安排的呼吁std::chrono::high_resolution_clock::now()和section_of_code_to_be_timed(),因此无效我定时测量.这是一个有效的担心吗?如果是这样,我可以通过声明t0 volatile或其他方式(如何)来阻止它吗?
(我注意到我可以使用RAII成语,类似于std::lock_guard,似乎没有用volatile...)
我正在制作一款适用于iOS的游戏,您可以在屏幕上拖动大对象.当我在实际的iPad/iPhone上运行游戏一段时间(连续在屏幕上以圆圈拖动物体)时,每隔5分钟左右,被拖动的物体就会大约10-30秒.然后,它回到移动丝般光滑.
在视觉上,看起来游戏的帧速率在一段时间内降至15 fps,但事实上它一直以坚如磐石的60 fps运行.然而,我注意到唯一不能顺利移动的是被拖动的物体,而游戏的其余部分都运行得非常顺畅.
这让我相信口吃与iOS中的触摸输入有关.所以我开始查看touchesMoved,并且看到它通常每16毫秒调用一次(因此触摸输入以60 fps运行).到现在为止还挺好.
然后我注意到当对象开始出现口吃时,touchesMoved开始以奇怪的时间间隔被调用,在8毫秒到50毫秒之间波动.
因此,当触摸屏处于这种奇怪的状态时,有时touchesMoved将在前一次调用后的8毫秒内被调用,有时它将在前一次调用后50毫秒被调用.当然,这使得拖动的对象看起来都很不稳定,因为它的位置是以不规则的间隔更新的.
你有什么想法会导致touchesMoved停止被定期调用,就像通常那样吗?
奖金:
- 无论何时我倾斜屏幕以强制屏幕方向改变,大约70%的时间触摸屏进入上述状态,其中touchesMoved开始被不规则地调用.然后在10-20秒后它恢复正常,一切看起来都很平稳.
- 我已经在两台iPad和两台iPhone上试用了iOS 6和7,这个问题出现在所有这些设备上.
- OpenGLES视图用于显示图形.它使用同步到显示刷新率CADisplayLink.
- 我用来测试这个的Xcode项目是由unity3d游戏开发工具生成的,但是我发现了几个出现同样问题的非统一游戏.这似乎是一个系统范围的问题.注意我正在测量objective-c中使用的时间CFAbsoluteTimeGetCurrent,完全在统一之外.
我有一个scala代码一次运行多个期货.我想分析执行每个时间所花费的时间.例如:
for (i <- 1 to 100) {
val f = future { runAndTime(doSomething()) }
f.onComplete {
case Success(timeTaken) => println(timeTaken)
case Failure(t) => println(t.getMessage())
}
}
Run Code Online (Sandbox Code Playgroud)
一个天真的实现runAndTime可能是:
def runAndTime(func: => Unit) = {
var time = System.currentTimeMillis()
func
System.currentTimeMillis() - time
}
Run Code Online (Sandbox Code Playgroud)
这个问题runAndTime是当线程没有执行时(例如,如果在func的中间它从cpu中出队并且其他一些线程开始运行)系统仍在花费时间,所以我们没有花时间在该特定线程中但是线程启动和线程结束之间的总时间差.
如何编写一个runAndTime将计算未来在CPU中实际执行的时间?
Ipython %timeit和%%timeit是我最常用的两个IPython Magic命令(Python交互式shell)。通常%timeit与以下功能没有什么不同:
def timeit(f, *args, **kwargs):
num_trials = estimate_number_of_trials_for_f(f, args, kwargs)
start = time.time()
for i in range(num_trials):
f(args, kwargs)
return time.time() - start
Run Code Online (Sandbox Code Playgroud)
优点是可以交互地执行以下操作(我知道这不是一个很好的示例用例):
In [119]: %%timeit
.....: data = json.loads(json_data)
.....: ret = process_data(data)
.....: json.dumps(ret)
Run Code Online (Sandbox Code Playgroud)
我想知道是否有与之等效的红宝石(irb或pry),或者一般情况下实现该等效的惯用方式(仅接受一个方法的时间并不完全相同,因此最好获得等效的方法)任意代码段的%timeit魔术的作用,如后面的示例所示)。
我正在尝试用C++编写的代码.我有一个内部和外部循环,我想分开时间,但同时.由于某种原因,当我这样做时,其中一个实例返回1.84467e + 13并且总是这个确切的数字.
为什么会这样?
这是一个在我的机器上复制效果的最小工作示例:
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
int main()
{
long int i, j;
clock_t start, finish, tick, tock;
double a = 0.0;
double adding_time, runtime;
start = clock();
for(i=0; i<10; i++)
{
a=0.0;
tick =clock();
for(j=0; j<10000000; j++)
{
a+=1;
}
tock= clock();
adding_time = (double)(tick - tock)/CLOCKS_PER_SEC;
cout << "Computation time:" << adding_time << endl;
}
finish = clock();
runtime = (double)(finish - start)/CLOCKS_PER_SEC;
cout << "Total computation time:" << runtime …Run Code Online (Sandbox Code Playgroud) 我想要一个程序,让用户有10秒钟的时间输入密码。如果计时器超过10秒,程序将显示一条消息。我当前的代码是这样的:
#include <iostream>
#include <ctime>
#include <string>
int main(){
std::string password;
int start_s=clock();
int stop_s=clock();
if(stop_s-start_s <= 0){
std::cout << "TIME RAN OUT!";
}
std::cout << "Enter your password! \n";
std::cout << "Password: ";
std::cin >> password;
std::cout << "\n \n";
if (password == "password123"){
std::cout << "Correct!";
} else {
std::cout << "Wrong!";
}
}
Run Code Online (Sandbox Code Playgroud)
这当然是行不通的...但是我不确定下一步该怎么做...有什么想法吗?
如果您需要更多详细信息,请在评论中提问。
编辑:
我刚刚意识到问题出在哪里……花了一个时间戳,然后迅速制作了另一个时间戳。当发现差异时,它低于0 ...
但是我仍然不知道下一步该怎么做...
我要实现的是检测屏幕上出现某些更改的准确时间(主要是使用Google Chrome浏览器)。例如,我使用显示项目$("xelement").show();或使用进行更改$("#xelement").text("sth new");,然后我想查看Performance.now()到底是什么,当更改以给定的屏幕重新绘制出现在用户的屏幕上时。因此,我完全可以接受任何解决方案-在下文中,我主要指的是requestAnimationFrame(rAF),因为这是应该帮助实现此功能的函数,只是似乎没有实现。见下文。
基本上,正如我所想象的,rAF应该在0-17毫秒内执行其中的所有操作(每当下一帧出现在我的标准60 Hz屏幕上)。此外,timestamp参数应提供此执行时间的值(并且该值基于与performance.now()相同的DOMHighResTimeStamp度量)。
现在,这是我为此进行的众多测试之一:https : //jsfiddle.net/gasparl/k5nx7zvh/31/
function item_display() {
var before = performance.now();
requestAnimationFrame(function(timest){
var r_start = performance.now();
var r_ts = timest;
console.log("before:", before);
console.log("RAF callback start:", r_start);
console.log("RAF stamp:", r_ts);
console.log("before vs. RAF callback start:", r_start - before);
console.log("before vs. RAF stamp:", r_ts - before);
console.log("")
});
}
setInterval(item_display, Math.floor(Math.random() * (1000 - 500 + 1)) + 500);
Run Code Online (Sandbox Code Playgroud)
我在Chrome中看到的是:rAF内的函数总是在大约0到3毫秒内执行(从紧接其前的performance.now()开始),最奇怪的是,rAF时间戳与我得到的完全不同rAF内的performance.now()通常比在rAF 之前调用的performance.now()早大约0-17毫秒(但有时在之后0-1毫秒)。
这是一个典型的例子:
before: 409265.00000001397
RAF callback start: 409266.30000001758
RAF stamp: 409260.832
before …Run Code Online (Sandbox Code Playgroud)