C#应用程序到C++ dll通过回调返回到C#应用程序
我正在编写调用C ++ DLL的C#应用​​程序.该DLL是成像系统的设备驱动程序.当获取图像时,可以逐行从库中获得图像的预览. C ++ DLL需要回调以填写预览,该回调基本上由最终图像的大小,当前扫描线和数据线本身组成. 问题是,从扫描停止和C#回调停止获取信息的时间起,有很大的延迟.程序的流量类似: 将回调从C# 内部分配给C ++ DLL 用户开始获取数据 设备启动 DLL几秒钟后开始拨打回调 设备完成图像形成 dll仍在调用图像形成时间的两倍的回调. 此相同的DLL与C ++应用程序一起使用,良好;似乎没有最后一步延迟.但是,在C#中,如果我有回调立即返回,则延迟仍然存在;无论我在回调中做什么,都在那里. 这种延迟是从非托管代码调用托管代码的固有限制,还是任何方面都可以做些什么来使其更快?我正在与C ++库作家接触,因此可以从C ++方面实现修复程序. 编辑:可以做一些简单的操作,例如命名的管道工作吗?应用程序可以从自己的管道上读取吗?
0 2024-04-16
编程技术问答社区
秒表与使用System.DateTime.Now进行计时事件的对比
我想跟踪代码的性能,因此我使用System.DateTime.Now存储了开始和结束时间.作为执行代码的时间,我将两者之间的区别在于. 我注意到差异似乎并不准确.因此,我尝试使用Stopwatch对象.事实证明这要精确得多. 谁能告诉我为什么Stopwatch使用System.DateTime.Now? 计算开始时间和结束时间之间的差异更准确 顺便说一句,我不是在谈论十分之一.我的差异约为15-20%. 解决方案 按照 msdn /p> 秒表通过计算基础计时器机制中的计时器滴答来测量所经过的时间.如果已安装的硬件和操作系统支持高分辨率性能计数器,则秒表类使用该计数器来测量经过的时间.否则,秒表类使用系统计时器来测量经过的时间.使用频率和高分辨率字段来确定秒表正时实现的精度和分辨率. 它使用的分辨率/精度比DateTime.Now 更高 您也可以查看以下相关链接: emoverition.tickcount.tickcount vs dateT
0 2024-04-10
编程技术问答社区
GDK3/GTK3窗口更新的精确时间
我使用GTK在C中编写的应用程序(尽管该语言可能对此问题不重要). 此应用程序具有一个完整的gtk_window,带有一个gtk_drawing_area.对于绘图区域,我已经通过gtk_widget_add_tick_callback注册了一个tick回调,该回调只会调用gtk_widget_queue_draw每个tick.在绘图区域draw回调中,我会定期更改整个窗口的颜色(例如,从1Hz处的黑色到白色). 说,在呼叫呼叫​​的电话中,我想将窗口从黑色更改为白色.我想知道实际上在屏幕上绘制了更改的精确时间(理想情况下是在与CLOCK_MONOTONIC相同的单元中).我认为这与tick回调中可用的GdkFrameClock不一样,据我了解,这是框架的时间,而不是实际显示框架在屏幕上的时间. 如果我只测量绘图回调中的CLOCK_MONOTONIC时间,然后使用照片模式在实际更改中通过附加的A2D进行测量,那么实际的更改是可以理解的,可以理解显示器延迟了许多刷新间隔(
0 2024-04-09
编程技术问答社区
Linux中用户空间的高精度计时
现在,我正在尝试确定一种测量特定函数所花费的时间的方法(类似于pthread_create).现在,当然,这些类型的功能非常优化,可以花费尽可能少的时间.实际上,很少有在用户空间中使用getTime的计时器,该计时器在微秒中衡量的计时器无法充分测量任何内容. 通常,如果我可以弄乱内核,我会使用诸如get_cycles之类的东西来测量原始循环数量作为性能指标.但是,我还没有找到在用户空间中这样做的方法.有没有一种方法可以使用get_cycles(或等效)或我可以在用户空间中使用的其他更高的精度计时器来测量极快的功能? 解决方案 clock_gettime允许您从线程启动,过程启动或epoch获得纳秒的精确时间. 其他解决方案 使用rdtsc(如果您在x86上)或clock_getTime unsigned long long cycleCount() { asm ("rdtsc"); } 其他解决方案 您是否尝试过时间执行您的功能所需的时间,例如100
0 2024-04-08
编程技术问答社区
Linux,需要准确的程序计时。调度器唤醒程序
我有一个在Linux系统上运行的线程,我需要在其准确的间隔内执行该线程.例如.执行每毫秒一次. 当前这是通过使用 创建计时器来完成的 timerfd_create(CLOCK_MONOTONIC, 0) ,然后在带有 的结构中传递所需的睡眠时间 timerfd_settime (fd, 0, &itval, NULL); 在此计时器上执行阻止读取呼叫,该计时器停止了线程执行并报告丢失唤醒呼叫. 问题在于,在较高的频率下,即使CPU使用率低于10%,系统也会开始丢失截止日期.我认为这是由于调度程序频繁唤醒线程无法检查阻塞呼叫.我可以使用命令来告诉调度程序,以在某些时间间隔唤醒线程? 由于系统处理许多其他任务,因此忙碌是一个不好的选择. 谢谢. 解决方案 您需要获得RT Linux*,然后增加要定期唤醒的过程的RT优先级. 其他,我看不到您的代码中的问题,如果您的过程没有被阻止,它应该可以正常工作. (*)RT Linux-应用一些实
0 2024-04-08
编程技术问答社区
Linux,需要准确的程序计时。调度器唤醒程序
我有一个在Linux系统上运行的线程,我需要在其准确的间隔内执行该线程.例如.执行每毫秒一次. 当前这是通过使用 创建计时器来完成的 timerfd_create(CLOCK_MONOTONIC, 0) ,然后在带有 的结构中传递所需的睡眠时间 timerfd_settime (fd, 0, &itval, NULL); 在此计时器上执行阻止读取呼叫,该计时器停止了线程执行并报告丢失唤醒呼叫. 问题在于,在较高的频率下,即使CPU使用率低于10%,系统也会开始丢失截止日期.我认为这是由于调度程序频繁唤醒线程无法检查阻塞呼叫.我可以使用命令来告诉调度程序,以在某些时间间隔唤醒线程? 由于系统处理许多其他任务,因此忙碌是一个不好的选择. 谢谢. 解决方案 您需要获得RT Linux*,然后增加要定期唤醒的过程的RT优先级. 其他,我看不到您的代码中的问题,如果您的过程没有被阻止,它应该可以正常工作. (*)RT Linux-应用一些实
0 2024-04-08
编程技术问答社区
如何计算C语言的执行时间?
如何在以下代码中计算执行时间: #include /* Core input/output operations */ #include /* Conversions, random numbers, memory allocation, etc. */ #include /* Common mathematical functions */ #include /* Converting between various date/time formats */ #include #define PI 3.1415926535 /* Known vaue of PI */ #define NDARTS
2 2024-04-07
编程技术问答社区
我如何在C语言中找到我的程序中某一节的执行时间?
我正在尝试找到一种方法来获取C.秒和时钟()似乎给了我毫秒(还是百分之秒?),但是我想要更精确的东西.有没有一种方法可以至少以微秒的精度抓住时间? 这只需要能够在Linux上进行编译. 解决方案 您提到clock()和time() - 您是否在寻找gettimeofday()? 这将填充struct timeval,其中包含秒和微秒. 当然,实际分辨率取决于硬件. 其他解决方案 对于它的价值,这只是一个宏: #include clock_t startm, stopm; #define START if ( (startm = clock()) == -1) {printf("Error calling clock");exit(1);} #define STOP if ( (stopm = clock()) == -1) {printf("Error calling clock");exit(1);} #define PRINTTIM
0 2024-04-07
编程技术问答社区
C语言中的最佳计时方法?
为具有高分辨率和可移植性的代码部分计时的最佳方法是什么? /* Time from here */ ProcessIntenseFunction(); /* to here. */ printf("Time taken %d seconds %d milliseconds", sec, msec); 是否有一个标准库会有跨平台解决方案? 解决方案 我认为这应该有效: #include clock_t start = clock(), diff; ProcessIntenseFunction(); diff = clock() - start; int msec = diff * 1000 / CLOCKS_PER_SEC; printf("Time taken %d seconds %d milliseconds", msec/1000, msec%1000); 其他解决方案 getTimeofday()可能会做您想要的. 如果
0 2024-04-06
编程技术问答社区
如何在Xcode中启用构建定时?
我想知道我的项目的构建需要多长时间,例如通过在构建窗格中显示. 此选项在xcode中可用吗? 谢谢. 解决方案 在终端中键入此内容: defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES 持续时间出现在构建后的活动查看器中,以及"成功"的消息. 如果您正在运行该应用程序,则状态将被运行状态替换,然后才能看到持续时间. 这取代了Xcode旧版本中使用的条目: 默认值写com.apple.xcode showbuildoperation -duration yes xcode可能需要关闭,然后再输入此命令.持续时间应显示在项目窗口的左下方. XCode开发人员的评论:"与所有无证件用户默认值一样,这是不支持的,假定的(但不能保证)准确,并且不能保证在以后的版本中有效." > 其他解决方案 在Xcode 10中,您现在可以使用其定时摘要功能看到构建时间的巨
0 2024-04-04
编程技术问答社区
Python计时,以触发特定事件
在python中,我想运行一个函数,调用默认操作20秒.但是,在应触发其他功能时,在这20秒内有5个特定的时间.为了简化我的代码,我用简单的打印命令替换了"动作"功能. 这是我到目前为止所拥有的 - 输出似乎还可以,因为它可以持续10秒并打印时间和默认状态/操作.但是触发的动作丢失了!有更好/正确的方法吗? import random import time import numpy as np import itertools def uniform_min_range(a, b, n, min_dist): while True: atimes = np.random.uniform(a, b, size=n) np.sort(atimes) if np.all(np.diff(atimes) >= min_dist): return atimes def timings(): g
2 2024-03-30
编程技术问答社区
如何使用MT模板语言对大块的代码进行计时处理?
通常在开发可移动类型的模板时,我想出了多种产生相同结果的方法,并且很好奇,这更有效.或者,我只是想知道要花多长时间的时间,例如生成搜索结果. 有没有一种简单的方法来使用模板标签记录处理时间或其他计时策略,而无需外部工具? 解决方案 这是我想到的方法,并且已经使用了一段时间.它使用标准可移动类型的模板语言报告了时间到最接近的第二个. 为了安排一块模板代码,创建一个系统或博客级模板模块,称为"计时":
0 2024-03-30
编程技术问答社区
为什么clock_gettime(CLOCK_REALTIME, ...)的调用延时变化如此之大?
我正在尝试付费clock_gettime(CLOCK_REALTIME,...)需要拨打多长时间. "回到一天",我曾经在循环的顶部打一次它,因为这是一个相当昂贵的电话.但是现在,我希望通过VDSO和一些时钟的改进,它可能不会那么慢. 我编写了一些使用__rdtscp的测试代码来计时重复调用clock_gettime(rdtscp呼叫绕了一个循环,称为clock_gettime并将结果添加在一起,因此编译器不会优化编译器太多了). 如果我快速连续地调用clock_gettime(),则长度从约45k时钟循环到500个周期.我认为其中一些可能是为了加载VDSO代码的第一个电话(对我来说仍然没有充分意义),但是我根本无法解释500的电话需要几个电话,而且这种行为似乎无论我如何测试如何,要保持不变: 42467 1114 1077 496 455 但是,如果我在拨打clock_gettime之间睡觉(第二秒或十个都不重要),它只能达到约4.7k周期的稳态状态: 在这
12 2024-03-30
编程技术问答社区
测量PHP脚本的时间-使用$_SERVER['REQUEST_TIME']
这是测量脚本的可靠方法: $time = ($_SERVER['REQUEST_TIME_FLOAT'] - $_SERVER['REQUEST_TIME']); 或 $time = (microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']); 应该使用哪一个? 每个人有什么区别? 他们返回非常不同的测量值. 解决方案 $time = ($_SERVER['REQUEST_TIME_FLOAT'] - $_SERVER['REQUEST_TIME']); 这将永远不会为您提供PHP脚本的执行时间.因为两个值都用于存储请求的启动.区别在于,$_SERVER['REQUEST_TIME_FLOAT']更精确,并以微秒精度存储时间值,而$_SERVER['REQUEST_TIME']则以秒为单位. . $time = (microtime(true) - $_SERVER['REQUEST_TIME
0 2024-03-30
编程技术问答社区
一个Hadoop作业的CPU时间意味着什么?
恐怕我不了解地图减少工作的时间结果.例如,我正在运行的工作为我带来了工作跟踪器的以下结果. 完成:1分钟,39秒 CPU花费的时间(MS)150,460 152,030 302,490 所花费的CPU时间(MS)中的条目分别用于地图,减少和总数.但是,那么如何测量" CPU时间",这意味着什么?这是分配给工作的每个映射器和还原器中所花费的总累积时间吗?是否可以从框架中测量其他时间,例如洗牌,排序,分区等?如果是这样,如何? 第二个困扰我的问题.我在这里看到了一些帖子( link1 ,long start = new Date().getTime(); boolean status = job.waitForCompletion(true); long end = new Date().getTime(); System.out.println("Job took "+(end-start) + "milliseconds"); 这是否不做任何工作追踪器输出中
0 2024-03-30
编程技术问答社区
使用C++11对代码进行可移植计时的正确方法
我正在编写一些时间延迟要求的程序的一些计时代码. 查看std :: Chrono库中可用的内容,我发现编写可移植的定时代码有点困难. std :: Chrono :: High_resolution_clock std :: chrono :: stestend_clock std :: Chrono :: System_clock System_Clock毫无用处,因为它不稳定,其余两个时钟是有问题的. High_resolution_Clock不一定在所有平台上稳定. stestend_clock不一定支持细粒度分辨率时间(例如:纳米秒) 出于我的目的,稳定时钟是最重要的要求,我可以通过微秒粒度来获得. 我的问题是,是否想要在不同的H/W架构和OS上运行的时间代码 - 最好的选择是什么? 解决方案 使用steady_clock.在所有实现方面,其精度是纳秒.您可以通过打印steady_clock::period::num和stea
0 2024-03-30
编程技术问答社区
冲洗缓存以防止基准波动
我正在运行某人的C ++代码,以在数据集上进行基准测试.我遇到的问题是,如果我再次运行相同的代码,我经常会得到第一次运行的时机,这些数字会大大变化(即28秒至10秒).我认为这是由于CPU的自动缓存而发生的.有没有办法冲洗缓存或以某种方式防止这些波动? 解决方案 不是一个"无处不在的一切".大多数处理器都有特殊的说明来冲洗缓存,但通常是特权说明,因此必须从OS内核内部完成,而不是您的用户模式代码.当然,对于每个处理器架构来说,这是完全不同的说明. 所有当前的X86处理器确实具有clflush指令,可以冲洗一个缓存线,但是为此,您必须拥有要刷的数据(或代码)的地址.对于小而简单的数据结构来说,这是可以的,如果您有一棵遍布整个地方的二进制树,则不太好.当然,根本不是便携式的. 在大多数环境中,阅读和编​​写大量替代数据,例如类似: // Global variables. const size_t bigger_than_cachesize = 10 * 1024
2 2024-03-30
编程技术问答社区
多线程基准测试问题
我编写了一个代码,该代码将从尺寸2x2到50x50的两个矩阵随机生成两个矩阵.然后,我正在记录每个矩阵乘法所需的时间,从2到50.我记录了这段时间100次,以获得每种情况2 -50的良好平均值.该程序首先通过顺序乘矩阵并记录CSV文件中的平均执行时间.然后,它使用pthreads移动到并行矩阵乘法,并在单独的CSV文件中记录平均执行时间.我的问题是,顺序乘法的平均执行时间比并行执行短得多.对于尺寸50的矩阵,顺序乘法需要500个微秒,并且平行乘法需要2500个微秒.这是由于我如何计时代码的问题吗?还是我的线程实现不太好,实际上导致代码需要更长的时间才能执行?在矩阵的一代之后,我将启动计时器,并在所有线程结合在一起后将其停止.线程代码最初是为两个尺寸不均匀的矩阵编写的,因此它实现了负载平衡算法. #include #include #include #include #include
2 2024-03-30
编程技术问答社区
在C++中获得一个准确的执行时间(微秒)。
我想在通过C ++实施的程序的微观秒内获得准确的执行时间. 我试图通过clock_t获得执行时间,但这不是准确的. (请注意,微基准测试是 hard .准确的计时器只是短时间区域获得有意义结果所需的一小部分.请参见惯用性能评估方式?对于一些更一般的警告) 解决方案 如果您使用的是C ++ 11或更高版本,则可以使用std::chrono::high_resolution_clock. 一个简单的用例: auto start = std::chrono::high_resolution_clock::now(); ... auto elapsed = std::chrono::high_resolution_clock::now() - start; long long microseconds = std::chrono::duration_cast( elapsed).count();
0 2024-03-30
编程技术问答社区