MATLAB tic-toc 和 C 的时钟差异

2023-11-23

我编写了一些 C 代码,在使用 MEX 编译后将其称为 MATLAB。在 C 代码中,我测量了 a 的时间part使用以下代码进行计算:

clock_t begin, end;
double time_elapsed;
begin = clock();
/* do stuff... */
end = clock();
time_elapsed = (double) ((double) (end - begin) / (double) CLOCKS_PER_SEC);

经过的时间应该是以秒为单位的执行时间。

然后我输出值time_elapsed到 MATLAB(它已正确导出;我检查过)。然后 MATLAB 端我调用这个 C 函数(在使用 MEX 编译它之后),并使用以下命令测量其执行时间tic and toc。事实证明完全荒谬的是,我使用 tic 和 toc 计算的时间是 0.0011s(500 次运行的平均值,st.dev.1.4e-4),而 C 代码返回的时间是 0.037s( 500 次运行的平均值,标准偏差 0.0016)。

这里人们可能会注意到两个非常奇怪的事实:

  1. 整个函数的执行时间低于部分代码的执行时间。因此,MATLAB 或 C 的测量结果非常不准确。
  2. C 代码中测量的执行时间非常分散,并且表现出非常高的稳定性。偏差(变异系数为 44%,而 tic-toc 的变异系数仅为 13%)。

这些计时器发生了什么?


您正在将苹果与橙子进行比较。

看看Matlab的文档:

tic - http://www.mathworks.com/help/matlab/ref/tic.html
toc - http://www.mathworks.com/help/matlab/ref/toc.html

tic and toc让您测量实际经过的时间。

现在看看clock功能http://linux.die.net/man/3/clock.

尤其,

Clock() 函数返回一个处理器时间的近似值由程序使用。

返回的值是到目前为止使用的CPU时间作为时钟_t;到 获取使用的秒数,除以 CLOCKS_PER_SEC。如果 使用的处理器时间不可用或者其值无法 表示,该函数返回值 (clock_t) -1。

那么什么可以解释您的差异:

  • CPU时间(由clock()测量)和实际运行时间(由tic和toc测量)不同。那么您会期望 cpu 时间小于经过时间吗?也许。如果您在 0.0011 秒内以 100% 的速度驱动 10 个内核会怎样?这意味着,clock() 测量值是 tic 和 toc 测量值的 10 倍。有可能,也不太可能。
  • Clock(.) 非常不准确,并且与文档一致,它是一个近似cpu时间测量!我怀疑它与调度程序量子大小挂钩,但我没有深入研究 Linux 内核代码来检查。我也没有检查其他操作系统,但是这家伙的博客与该理论一致。

那么该怎么办...首先,比较苹果与苹果!接下来,请确保考虑计时器分辨率。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB tic-toc 和 C 的时钟差异 的相关文章

随机推荐

  • 如何使用 pandas 更改数据框中文本的字体大小

    我研究了 pandas 的样式文档 但无法准确地得到我的问题的特定和准确的答案 我正在使用数据帧读取 Excel 文件并在程序中处理该数据帧 最后 我使用 xlwings 库在另一个现有的 Excel 文件中写入处理后的数据帧 我在用 im
  • 如何使编辑器句柄可选择以显示属性检查器窗口

    这是来自的后续问题如何使贝塞尔曲线的各个锚点连续或不连续 请参阅它以获取已接受答案中的相关代码 请注意 我这样做是为了保持这个问题的简洁 因为相关代码相当冗长 我正在努力实现以下目标 使贝塞尔曲线手柄 控制点可选择 以便在选择时单个手柄的属
  • 根据谓词将列表拆分为列表列表

    我知道这个问题 但它与序列有关 这不是我的问题 给定此输入 例如 let testlist text1 text2 text3 text4 text5 text6 text7 let pred s string s StartsWith 我
  • 如何在 Swift 中将类分配给启动屏幕?

    我正在尝试更改从我的闪屏类调用 Web 服务的类 但它会触发错误消息 错误是 启动画面不允许自定义类 您的启动故事板在您的应用程序开始执行之前显示 因此 正如错误所示 它无法执行代码 您可以复制启动故事板中的场景作为主故事板的初始视图控制器
  • 在php中解析法国日期

    我有字符串 伦迪 2013 年 7 月 8 日 09 09 如何解析这个类型的字符串 I try date 08 Juillet 2013 09 09 date new DateTime date 但它抛出异常 The intl扩展可以用于
  • 您能否限制可以在 MATLAB GUI 编辑框中输入哪些字符?

    我想在 MATLAB GUI 中创建一个编辑框 仅允许在其中输入数字或字母 这可能吗 不存在这样的功能 至少没有记录在案 您可以分配一个回调来检查输入 但这将会发生after用户输入了非法字符 虽然我不知道具体该怎么做 但我猜你可以使用 J
  • ActionListener 如何工作?

    我知道如何使用动作侦听器并实现它们 但我想知道是否有人可以告诉我他们如何侦听事件 有某种轮询机制吗 操作侦听器使用以下方法注册事件观察者模式主事件循环会通知他们所注册的任何事件 所以不 这不是一个轮询 拉 机制 而是相反的 一个 推 回调
  • 拖动 WPF 用户控件

    我创建了一个可移动的UserControl
  • MySQL:在多列中查找相同的字符串

    我正在尝试制作一个类似搜索页面的功能 我想进行查询以在 ColumnA 和 ColumnB 以及 ColumnC 和 ColumnD 中查找 query 并选择在任何这些列中具有单词 短语 query 的行 这似乎有效 SELECT FRO
  • 从客户端的对象数组中获取最新日期的优雅方法是什么?

    我在项目中使用AngularJS 我从服务器获取对象数组 每个对象都包含几个属性 其中之一是日期属性 这是我从服务器获取的数组 json 格式 Address 25 AlertType 1 Area North MeasureDate 20
  • UIScrollView 按偏移量滚动

    我有这样的情况 适合所有屏幕的一个滚动视图 scrollView内部有N个 单元格 每个单元格包含一个标签 每个单元格的高度为 80px 固定绿色遮罩 UIView 我以编程方式创建带有标签的单元格 UIView 并正确设置scrollVi
  • MySQL命令解释忽略LIMIT?

    我使用MySQL服务器版本5 5 14 现在我正在尝试使用Explain命令进行这个简单的SQL查询 EXPLAIN SELECT id name thumb FROM twitter profiles LIMIT 10 它向我显示了这个结
  • Ninject.MVC3 Bootstrapper 的 Kernel 属性被标记为“已过时”。我怎样才能访问内核?

    我将 Ninject MVC3 包从 2 2 1 0 更新到 2 2 2 0 之前我可以通过 BootStrapper Kernel 属性访问 Kernel 对象 但在新版本中 Kernel 属性被标记为过时 我收到警告说 公共只读属性内核
  • 比较 pandas 列中的浮点数

    我有以下数据框 actual credit min required credit 0 0 3 0 4 1 0 5 0 2 2 0 4 0 4 3 0 2 0 3 我需要添加一列 指示actual credit gt min require
  • JavaScript 预加载是如何工作的?

    我不想知道预加载图像的方法 我在网上找到了很多 但我想知道它是如何工作的 javascript 如何预加载图像 我的意思是 我尝试了这里的一个片段 即使它有效 它似乎也没有预加载图像 当我检查 firebug 时 我可以看到图像加载了两次
  • 解密使用 RSA java 加密的“长”消息

    您好 这是两年前问过的同一个问题 Java JCE 解密使用 RSA 加密的 长 消息 我有一个大字节数组和 rsa 密钥对 由值 1024 启动 使用 rsa 加密和指定密钥大小是强烈要求 我无法更改它 所以我不能使用对称加密和非对称加密
  • 通过 PHP 从网站提取数据

    我正在尝试为一些朋友创建一个简单的警报应用程序 基本上我希望能够从如下两个网页中提取数据 价格 和 库存可用性 http www sparkfun com commerce product info php products id 5 ht
  • 最大允许的内容安全策略是什么?

    我有一个庞大的遗留代码库 我想将其引入Content Security Policy标头打开 短期内想要真正锁定站点是不可行的 例如 到处都是内联脚本 没有自动化测试覆盖 但至少我可以从禁止访问我知道的内容源开始目前肯定没有使用 然后随着时
  • 使用输出流序列化对象

    假设我有一个OutputStream 而不是一个 ObjectOutputStream 是否可以使用 write 方法发送序列化对象 谢谢 以下是序列化对象的操作 new ObjectOutputStream outputStream wr
  • MATLAB tic-toc 和 C 的时钟差异

    我编写了一些 C 代码 在使用 MEX 编译后将其称为 MATLAB 在 C 代码中 我测量了 a 的时间part使用以下代码进行计算 clock t begin end double time elapsed begin clock do