问题标签 [low-latency]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
1469 浏览

c++ - 如何声明必须实现而不是虚拟的功能?

我正在使用类来声明接口。我只想定义方法签名。此方法必须在任何非抽象子类中实现。我不需要方法是虚拟的。这是 C# BTW 中的默认行为(我来自 C#/Java 世界)

但是,在 C++ 中似乎是不可能的。我要么以常规方式声明方法

然后不强制实现它或将方法声明为“纯虚拟”

然后方法变为虚拟,但我想避免这种情况以节省一点性能。

看来我想要那样的东西

但这将是编译错误

0 投票
2 回答
13545 浏览

windows - 具有最小延迟的串行通信

我有一台通过串行通信(即物理或模拟串行端口的 RS-232/RS-422)与外部设备连接的计算机。它们通过频繁的数据交换(30Hz)相互通信,但只有很小的数据包(每个包少于 16 个字节)。

通信的最关键要求是传输和接收之间的低延迟或延迟。

数据交换模式类似于握手。一个主机设备启动通信并继续在客户端设备上发送通知。客户端设备需要尽快回复来自主机设备的每个通知(这正是需要实现低延迟的地方)。通知和回复的数据包定义明确;即数据长度是已知的。并且基本上不允许数据丢失。

我使用了以下常见的 Win API 函数以同步方式进行 I/O 读/写:CreateFile、ReadFile、WriteFile

客户端设备使用 ReadFile 从主机设备读取数据。一旦客户端读取了长度已知的完整数据包,它使用WriteFile向主机设备回复相应的数据包。读取和写入始终是顺序的,没有并发性。

不知何故,通信速度不够快。即数据发送和接收之间的时间间隔太长。我想这可能是串行端口缓冲或中断的问题。

在这里,我总结了一些可能的措施来改善延迟。请给我一些建议和更正:)

  1. 使用 FILE_FLAG_NO_BUFFERING 标志调用 CreateFile?我不确定这个标志在这种情况下是否相关。
  2. 在每个 WriteFile 之后调用 FlushFileBuffers?或任何可以通知/中断串口立即传输数据的动作?
  3. 为处理串行通信的线程和进程设置更高的优先级
  4. 为模拟设备(及其驱动程序)设置延迟计时器或传输大小。但是物理串口呢?
  5. Windows上的任何等效东西,例如Linux下的setserial/low_latency?
  6. 禁用先进先出?

提前致谢!

0 投票
1 回答
439 浏览

android - 为什么 Nexus 7 和 Nexus 10 在相同的操作系统下会有不同的音频延迟?

我读过 Android 4.2 Jelly Bean OS 上的音频延迟已降至 12 毫秒。但是,我还了解到,Nexus 10 上提供了这种改进,但 Nexus 7 上没有。

这两个设备如何使用相同的操作系统,却有不同的音频延迟?这些信息准确吗?

0 投票
1 回答
1665 浏览

c++ - 如何在 FAST 金融协议中实现 feed A 和 feed B 的仲裁?

我需要为FAST协议实施提要仲裁。问题很常见,甚至有硬件解决方案由于问题广为人知,我确实认为至少应该有关于如何实现该问题的一般建议(我应该使用多少查询,多少环形缓冲区,多少读者,何时丢弃数据包等),可能有人可以指出我的一些实现。对于那些不熟悉 FAST 的人,我添加一些描述:


所有 UDP 源中的数据都在两个不同的多播 IP 上的两个相同的源(A 和 B)中传播。强烈建议客户端接收并处理这两个提要,因为可能会丢失 UDP 数据包。处理两个相同的提要允许一个在统计上降低丢包的概率。未指定消息首次出现在哪个特定提要(A 或 B)中。要仲裁这些提要,应该使用在 Preamble 或标签 34-MsgSeqNum 中找到的消息序列号。Preamble 的使用允许在不解码 FAST 消息的情况下确定消息序列号。应使用以下算法处理来自提要 A 和 B 的消息:

  1. 收听提要 A 和 B
  2. 根据消息的序号处理消息。
  3. 如果之前已经处理过具有相同序列号的消息,则忽略该消息。

    // tcp 恢复算法进一步


所以我认为解决方案应该是这样的:

  1. 为两个提要中的每一个创建专用线程和专用缓冲区。数据到达时将数据添加到缓冲区。(应该是环形缓冲区还是队列还是什么?)

  2. 创建“旋转”的“阅读器”并检查两个线程是否有最后一个可用的“序列号”。一旦“序列号”可用,就需要处理下一个数据包,并且两个线程都应该在此之后丢弃它。

欢迎任何关于如何实现算法本身的建议以及可能使用哪些结构的建议。特别是可能有人可以建议无锁队列/环形缓冲区实现。

0 投票
0 回答
681 浏览

linux - 即使只有一个连接,“epoll”是否比“select”更快?

我已经尝试过这种方式:在同一台PC上创建一个服务器和一个客户端,并将一个数据包从客户端发送到服务器。一旦服务器端接收到数据包,它就会将相同的数据包发送回客户端。我循环了 1000,000 次,得到总消耗时间,然后取平均值。令我惊讶的是,“select”的平均延迟为 33 微秒,而“epoll”的延迟仅为 10 微秒。由于我只建立了一个连接,我没想到'epoll'延迟更短。这合理吗?谢谢。

0 投票
2 回答
3976 浏览

c++ - 如何预取不常用的代码?

我想将一些代码预取到指令缓存中。代码路径很少使用,但我需要它在指令缓存中,或者至少在 L2 中,因为它在极少数情况下使用。我提前通知了这些罕见的情况。_mm_prefetch 是否适用于代码?有没有办法在缓存中获取这个不经常使用的代码?对于这个问题,我不关心可移植性,所以即使 asm 也会这样做。

0 投票
1 回答
745 浏览

java - 寻找具有线程池和最小调度延迟的 ExecutorService

寻找ExecutorService类似的ThreadPoolExecutorForkJoinPool以最小的延迟将任务添加到工作队列并将它们出列以执行。

非常希望它能够感知 CPU 缓存并具有可调整的退避策略和线程工厂。

或者至少是烹饪它的部分的最佳例子。

0 投票
2 回答
24849 浏览

hadoop - HDFS 中的高吞吐量与低延迟

我试图用我自己的话来定义 HDFS 中的高吞吐量与低延迟意味着什么,并提出了以下定义:

HDFS 经过优化,可以更快地访问批量数据集(高吞吐量),而不是该数据集中的特定记录(低延迟)

是否有意义?:)

谢谢!

0 投票
1 回答
91 浏览

language-agnostic - 在现代 PC 中向外部硬件输出信号的绝对最快方法是什么?

我想知道,从 PC 产生外部信号(例如连接到其他设备的电线上的 CMOS 状态从 0 变为 1 等)的绝对最快方式(最低延迟)是什么,从 CPU 汇编程序的那一刻开始计算知道必须产生信号。

我知道网络设备、usb、VGA 显示器输出与其他接口(SATA、PCI-E)相比有一些较大的延迟。假设汇编程序的输出中的哪些接口或哪些硬件修改可以提供接近 0 的延迟?

0 投票
1 回答
1064 浏览

android - Android 上的线程低延迟音频

简短版本:我正在开发一个合成器应用程序并使用低延迟的 Opensl。我在 Opensl 回调函数中进行所有音频计算(我知道我不应该,但我还是做了)。现在计算在我的 nexus 4 上花费了大约 75% 的 cpu 时间,所以下一步是在多个线程中进行所有计算。

我遇到的问题是音频开始结巴,因为回调线程显然以高优先级运行,而我的新线程却没有。如果我使用更多/更大的缓冲区,问题就会消失,但实时也是如此。在新线程上设置更高的优先级似乎不起作用。那么,甚至有可能做线程化的低延迟音频,还是我必须在回调中做所有事情才能让它工作?

我有一个包含 256 个样本的缓冲区,大约需要 5 毫秒,这应该是线程调度程序运行我的计算线程的时间。