我刚看到这个问题,其中一个答案表明System.Diagnostics.Stopwatch只能用于诊断性能而不能用于生产代码.
在这种情况下,什么是在.NET中获得精确计时的最佳方法?我目前正处于使用NAudio的MIDI输出功能构建一个非常简单的MIDI音序器的早期阶段.我希望能够以尽可能小的抖动将MIDI消息发送到(例如)1/10s.这是可行的,还是像上下文切换这样的事情毁了我的一天?
我目前在控制台应用程序中有一些代码,Stopwatch在150bpm生成1/16笔记流时不断调用和计算抖动.在这种情况下抖动非常低.但是,我将把它移到另一个线程,所以我不知道是否仍然如此.
我GetSystemTimeAdjustment在Windows 7上使用该功能运行了一些测试,得到了一些我无法解释的有趣结果.正如我所理解的那样,如果系统时间定期同步,则该方法应该返回,如果是,则在哪个时间间隔以及更新它的增量(请参阅MSDN上的GetSystemTimeAdjustment函数).
从此我可以看出,如果我查询系统时间,例如GetSystemTimeAsFileTime重复使用,我应该不做任何更改(系统时钟尚未更新),或者是检索到的增量的倍数的更改GetSystemTimeAdjustment.问题一:这个假设是否正确?
现在考虑以下测试代码:
#include <windows.h>
#include <iostream>
#include <iomanip>
int main()
{
FILETIME fileStart;
GetSystemTimeAsFileTime(&fileStart);
ULARGE_INTEGER start;
start.HighPart = fileStart.dwHighDateTime;
start.LowPart = fileStart.dwLowDateTime;
for (int i=20; i>0; --i)
{
FILETIME timeStamp1;
ULARGE_INTEGER ts1;
GetSystemTimeAsFileTime(&timeStamp1);
ts1.HighPart = timeStamp1.dwHighDateTime;
ts1.LowPart = timeStamp1.dwLowDateTime;
std::cout << "Timestamp: " << std::setprecision(20) << (double)(ts1.QuadPart - start.QuadPart) / 10000000 << std::endl;
}
DWORD dwTimeAdjustment = 0, dwTimeIncrement = 0, dwClockTick;
BOOL fAdjustmentDisabled = TRUE;
GetSystemTimeAdjustment(&dwTimeAdjustment, &dwTimeIncrement, …Run Code Online (Sandbox Code Playgroud) 我需要对1 us水平进行精确定时,以计算pwm波的占空比变化.
背景
我正在使用Gumstix Over Water COM(https://www.gumstix.com/store/app.php/products/265/),它有一个运行在499.92 BogoMIPS的单核ARM Cortex-A8处理器(Gumstix页面声称根据/ proc/cpuinfo,推荐使用800Mhz的1Ghz.操作系统是基于内核版本2.6.34的Linux的Angstrom Image版本,它在Gumstix Water COM上有库存.
问题
我已经对Linux中的精确计时做了相当多的阅读(并且已经尝试了大部分计划)并且共识似乎是使用clock_gettime()并引用CLOCK_MONOTONIC是最好的方法.(我本来希望使用RDTSC寄存器进行定时,因为我有一个具有最小省电能力的内核,但这不是Intel处理器.)所以这里是奇数部分,而clock_getres()返回1,表明分辨率为1 ns实际的时序测试表明,最小分辨率为30517ns或(它不能重合)恰好是32.768KHz时钟周期之间的时间.这就是我的意思:
// Stackoverflow example
#include <stdio.h>
#include <time.h>
#define SEC2NANOSEC 1000000000
int main( int argc, const char* argv[] )
{
// //////////////// Min resolution test //////////////////////
struct timespec resStart, resEnd, ts;
ts.tv_sec = 0; // s
ts.tv_nsec = 1; // ns
int iters = 100;
double resTime,sum = 0;
int i;
for (i = 0; i<iters; i++)
{
clock_gettime(CLOCK_MONOTONIC, &resStart); // start timer …Run Code Online (Sandbox Code Playgroud) 我有一段jQuery代码,可以getJSON()快速连续调用几个调用:
var table = $("table#output");
for (var i in items) {
var thisItem = items[i];
$.getJSON("myService", { "itemID": thisItem }, function(json) {
var str = "<tr>";
str += "<td>" + thisItem + "</td>";
str += "<td>" + json.someMember + "</td>";
str += "</tr>";
table.append(str);
});
}
Run Code Online (Sandbox Code Playgroud)
当我针对滞后服务器运行时,表会填充预期json.someMember值(它们按顺序到达:我不介意),但是thisItem列中填充了来自各种迭代的不可预测的值混合.
我假设这与范围和时间有关 - 回调函数是thisItem从更广泛的范围读取?我对吗?我该如何防止这种情况?
我目前的解决方法是让JSON服务返回其输入的副本 - 至少可以说是不满意的.
JavaScript中的某些事件先于其他事件发生.例如,对于input元素,keydown和keypress事件首先触发.然后,如果那些返回值不为false,则更新input.value.然后,keyup事件触发.
是否有一个网站,我可以找到所有事件及其执行顺序的完整列表,以及中间发生的其他事情,例如更新示例中输入框中的值?
这样的清单非常有用.
以下代码:
String str1="asdfavaxzvzxvc";
String str2="werwerzsfaasdf";
Object c=str1;
Object d=str2;
System.out.println(c);
long time1=System.currentTimeMillis();
for(int i=0;i<1000000000;i++){
if(c.equals(d)){
//System.out.println("asfasdfasdf"); // line 9
}
}
long time2=System.currentTimeMillis();
System.out.println("time taken in this is "+(time2-time1));
Run Code Online (Sandbox Code Playgroud)
当我取消对第9行的注释时,如果条件为真则打印,但是由于两个对象不相等都不会发生,所以它需要5000+毫秒,令我惊讶的是只需注释它只需要5毫秒,我没有理由,为什么它需要这么多时间,如果没有评论,因为它永远不会被执行...
这是某种分支预测效果吗?或任何类型的编译器优化
我目前正在解决Project Euler的问题,我正在用C#和Scheme(Racket实现)解决它们.我知道C#,但我正在学习Scheme.
现在,除了找到问题的正确结果之外,我还想提出我能想到的最快的解决方案.为此,在C#中我使用StopWatch来测量代码的性能.有时间代码执行的类似Scheme库/功能吗?
我的目标是编写一个框架,用于测量方法执行或事务时间以及处理测量,即存储,分析等.事务可能包括调用外部系统,同步或异步等待结果.
关于这个话题已经存在一些问题,比如
所有的答案归结为三种方法来花时间
System.currentTimeMillis()System.nanoTime()Instant.now()和Duration(自Java 8以来)我知道,所有这些都有一些影响
该方法的结果取决于平台.在Linux上你获得1ms的分辨率,在Windows中你得到10ms(单核)~15ms(多核).因此,可以测量大型运行操作或短期运行操作的多次执行.
你得到一个高分辨率的时间测量,具有纳秒精度(但不一定是纳秒精度),并且在292年之后你会得到溢出(我可以忍受它).
从Java 8开始,就有了新的时间API.瞬间有第二个和第二个纳米字段,因此它在对象引用的顶部使用两个长值(相同Duration).您还可以获得纳秒精度,具体取决于基础时钟(请参阅" 具有纳秒分辨率的Java 8 Instant.now()? ").实例化是通过调用Instant.now()哪些映射到System.currentTimeMillis()正常的系统时钟来完成的.
鉴于事实,很明显,最佳精确度只能通过实现System.nanoTime(),但我的问题更多地针对处理一般措施的最佳做法,这不仅包括采取措施,还包括措施处理.
Instant和Duration提供最佳API支持(计算,比较等),但在标准情况下具有os-dependend精度,内存和创建度量的更多开销(对象构造,更深的callstack)
System.nanoTime()和System.currentTimeMillis()具有不同的精度级别,但只有基本的"api"支持(数学操作为long),但更快和更小以保持在内存中.
那么最好的方法是什么?有没有我没想过的含义?还有其他选择吗?
我在具有8 GB RAM的macOS上具有4个内核(8线程超线程)的Intel i7并行生成大约400,000,000(4亿)个随机数.
但是,我也在DigitalOcean服务器上生成400,000,000个随机数,Debian上有20个内核,64 GB RAM.
这是代码:
import multiprocessing
import random
rangemin = 1
rangemax = 9
def randomGenPar_backend(backinput):
return random.randint(rangemin, rangemax)
def randomGenPar(num):
pool = multiprocessing.Pool()
return pool.map(randomGenPar_backend, range(0, num))
randNum = 400000000
random.seed(999)
randomGenPar(randNum)
Run Code Online (Sandbox Code Playgroud)
这些是基准测试的结果:
5,000,000 Random Numbers:
1 Core: 5.984
8 Core: 1.982
50,000,000 Random Numbers:
1 Core: 57.28
8 Core: 19.799
20 Core: 18.257
Times Benefit (20 core vs. 8 core) = 1.08
100,000,000 Random Numbers:
1 Core: 115
8 Core: 40.434
20 Core: 31.652 …Run Code Online (Sandbox Code Playgroud) python performance timing multiprocessing python-multiprocessing
我正在开发一个具有琶音/排序功能的音乐应用程序,需要很高的计时准确性.目前,使用"Timer"我已经达到了平均抖动约为5ms的精度,但最大抖动约为11ms,这对于8号,16号和32号音符的快速琶音来说是不可接受的.
我已经读过'CADisplayLink'比'Timer'更准确,但由于它的准确度(~16-17ms)限制在1/60秒,看起来它的准确性不如我已经实现了Timer.
潜入CoreAudio是实现我想要的唯一途径吗?还有其他方法可以实现更精确的计时吗?