标签: low-latency

C++:获取范围内整数的最快方法

我需要生成大约N = 1亿个密钥的哈希密钥.从我的研究看来,murmur3(MurmurHash3_x86_32,见murmur3 hash)将是最快的散列函数,具有最佳延迟和足够小的碰撞率.我面临的问题是该函数返回键为 void *.更具体地说,模板是:

void MurmurHash3_x86_32 (const void *key, int len, uint32_t seed, void *out);

由于我的哈希表大小将小于它可以生成的最大哈希,我需要将它放入表范围[0,N-1].最简单的解决方案似乎是使用%运算符.但由于众所周知这是一个缓慢的操作员,我想知道是否有更快的方法来解决问题.

我发现一个有趣的建议是否有替代在C/C++中使用%(模数)?在StackOverflow本身.它暗示了"两个人的力量,以下作品(假设两个补语表示)":

return i & (n-1);

我的问题是,在较新的CPU上,它有时(或者大部分时间都是这样?),由于多路缓存线,性能会在大约2 ^ n,IIRC附近降低.(此链接提供有关插入大内存的说明,第3.5部分:Google sparsehash!).

目前,murmur3的优势似乎因硬件相关问题和%运营商的低效率而无效.由于性能是一个约束,我要求低延迟和更快的解决方案,即使它不是MurmurHash3_x86_32.

c c++ hash modulo low-latency

6
推荐指数
1
解决办法
198
查看次数

.Net 中的低延迟串行通信

我一直在研究各种第三方库和 .Net 中低延迟串行通信的方法。我读了足够多的书,现在已经回到原点,由于各种相互冲突的观点,我所知道的和刚开始时一样少。

例如,框架中的功能被排除,因为一些令人信服的文章指出:“微软提供的解决方案在框架版本之间不稳定,并且缺乏功能。”

我发现文章抨击了许多旧的基于 COM 的库。我发现一些文章抨击了由于垃圾收集而导致整个 .Net 应用程序低延迟的想法。

我还读过一些文章,展示了如何为了低延迟通信的目的而调用 Windows API 功能是不可接受的。

这排除了我能想到的任何方法!

我真的很感谢那些经历过/经历过这种经历的人的一些话。理想情况下,我可以找到一个可靠的库/合作伙伴,而不必自己构建通信库。我有以下简单的目标:

  • C# / VB.Net 中的持续低延迟串行通信
  • 32/64位
  • 有据可查(如果解决方案是第三方)
  • 相对不受垃圾收集的影响(通信和延迟方面)。
  • 灵活(我不知道将来必须与什么接口!)我唯一确定的要求是我需要能够与许多不同的工业设备接口,例如基于 RS485 的线性执行器、串行/微控制器基于仪表和 ModBus(也是 RS485)设备。

非常感谢任何可能消除我的困惑的评论、想法、想法或文章链接!

.net serial-port communication low-latency

5
推荐指数
1
解决办法
4427
查看次数

使用TCP Ack来测量服务器的延迟?

我正在尝试测量我无法控制的服务器的延迟.这是在共同定位的环境中,因此延迟大约为500 us(.5 ms).

据我所知,思科设备经常优先考虑ICMP流量,使ping时间不可靠.有没有办法让我知道我正在穿越的装备是否就是这种情况?

我可以使用TCP确认来确定远程服务器的最小延迟吗?为此,我会以某种方式强制远程服务器在接收我的数据时立即发送TCP确认.

performance tcp latency low-latency

5
推荐指数
2
解决办法
4058
查看次数

Windows 8 - 低延迟音频

我正在考虑为即将推出的Windows 8开发应用程序.该应用程序需要低延迟的音频录制和回放,我正在尝试找出操作系统是否会支持(与其他平台相反).

所以我想知道的是:

  1. Windows 8中是否存在低延迟音频API?
  2. 是否会在PC以外的平台上支持(例如平板电脑)?

谢谢!

audio tablet low-latency windows-8

5
推荐指数
1
解决办法
6805
查看次数

哪里可以找到SolarFlare OpenOnLoad Kernel Bypass的一些示例Java代码?

让任何人开始的简单问题:

  1. 我知道我需要一个特殊的网络接口卡(nic)才能做到这一点.我假设它必须是SolarFlare制造的.我能得到的最便宜的是什么才能让我实现并测试内核旁路?

  2. 看起来他们使用OpenOnLoad作为网络堆栈.在哪里可以找到有关如何使用OpenOnLoad使用我的网络应用程序的示例代码和示例?我很想知道我的程序使用这项技术是多么容易或复杂.

问题来自于这个问题:Java中的内核绕过网络

java networking real-time low-latency openonload

5
推荐指数
1
解决办法
2263
查看次数

C++低延迟线程异步缓冲流(用于记录) - Boost

问题:

3下面的循环包含已注释掉的代码.我搜索("TAG1","TAG2"和"TAG3")以便于识别.我只是希望while循环在测试的条件下等待,然后继续进行,同时尽可能地减少CPU资源.我首先尝试使用Boost条件变量,但是存在竞争条件.让线程休眠'x'微秒是低效的,因为没有办法精确计时唤醒.最后,boost :: this_thread :: yield()似乎没有做任何事情.可能是因为我在双核系统上只有2个活动线程.具体来说,如何在引入尽可能少的不必要阻塞的同时,使下面的三个标记区域更有效地运行.

背景

目的:

我有一个记录大量数据的应用程序.在分析之后,我发现在日志记录操作上花费了很多时间(将文本或二进制文件记录到本地硬盘上的文件中).我的目标是通过使用线程缓冲流记录器的调用替换非线程直接写入调用来减少logData调用的延迟.

选项探索:

  • 将2005年代的慢速硬盘升级到SSD ......可能.成本并不高昂......但涉及大量工作......超过200台计算机必须升级......
  • 提升ASIO ......我不需要所有的proactor /网络开销,寻找更简单,更轻量级的东西.

设计:

  • 生产者和消费者线程模式,应用程序将数据写入缓冲区和后台线程,然后稍后将其写入磁盘.因此,最终目标是让应用程序层调用的writeMessage函数尽可能快地返回,而数据在以后的某个时间以FIFO顺序正确/完全记录到日志文件中.
  • 只有一个应用程序线程,只有一个编写器线程
  • 基于环形缓冲区.这个决定的原因是使用尽可能少的锁,理想情况......如果我错了,请纠正我......我认为我不需要任何锁.
  • Buffer是一个静态分配的字符数组,但如果出于性能原因需要/期望,可以将其移动到堆中.
  • Buffer有一个开始指针,指向应写入文件的下一个字符.缓冲区有一个结束指针,指向要写入文件的最后一个字符后的数组索引.结束指针NEVER传递开始指针.如果出现大于缓冲区的消息,则编写器等待直到缓冲区清空并直接将新消息写入文件,而不将超大消息放入缓冲区(一旦缓冲区清空,工作线程)不会写任何东西,所以没有争论).
  • writer(工作线程)仅更新环形缓冲区的开始指针.
  • 主(应用程序线程)仅更新环形缓冲区的结束指针,并且当有可用空间时,它仅将新数据插入缓冲区...否则它将等待缓冲区中的空间变为可用或直接按描述写入以上.
  • 工作线程不断检查是否有要写入的数据(由缓冲区启动指针!=缓冲区结束指针时的情况表示).如果没有要写入的数据,一旦应用程序线程将某些东西插入缓冲区,工作线程理想情况下应进入休眠状态并唤醒(并更改缓冲区的结束指针,使其不再指向与开始时相同的索引)指针).我在下面的内容涉及while循环不断检查该条件.这是一种非常糟糕/低效的缓冲区等待方式.

结果:

  • 在我的2009年配备SSD的双核笔记本电脑上,我看到线程/缓冲基准测试与直接写入的总写入时间大约是1:6(0.609秒对0.095秒),但变化很大.通常,缓冲写入基准测试实际上比直接写入慢.我认为可变性是由于等待空间在缓冲区中释放,等待缓冲区清空以及让工作线程等待工作变得可用而实现的可能性差.我已经测量过一些while循环消耗超过10000个周期,我怀疑这些循环实际上是在争夺另一个线程(工作者或应用程序)完成等待计算所需的硬件资源.
  • 输出似乎结账.启用TEST模式并将10的小缓冲区作为压力测试,我将数百MB的输出分开并发现它等于输入.

使用当前版本的Boost进行编译(1.55)

    #ifndef BufferedLogStream_h
    #define BufferedLogStream_h

    #include <stdio.h>
    #include <iostream>
    #include <iostream>
    #include <cstdlib>
    #include "boost\chrono\chrono.hpp"
    #include "boost\thread\thread.hpp"
    #include "boost\thread\locks.hpp"
    #include "boost\thread\mutex.hpp"
    #include "boost\thread\condition_variable.hpp"
    #include <time.h>

    using namespace std;

    #define BENCHMARK_STR_SIZE 128
    #define NUM_BENCHMARK_WRITES 524288
    #define TEST 0
    #define BENCHMARK 1
    #define WORKER_LOOP_WAIT_MICROSEC 20
    #define MAIN_LOOP_WAIT_MICROSEC 10

    #if(TEST)
    #define BUFFER_SIZE 10 
    #else …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading boost asynchronous low-latency

5
推荐指数
1
解决办法
4981
查看次数

使用QAudioOutput(qt)实时流式传输

我想播放实时响应,没有明显的用户交互延迟.

为了获得低延迟,我必须发送一小块pcm数据.我在做什么:

    QAudioFormat format;
    format.setSampleRate(22050);
    format.setChannelCount(1);
    format.setSampleSize(16);
    format.setCodec("audio/pcm");
    format.setByteOrder(QAudioFormat::LittleEndian);
    format.setSampleType(QAudioFormat::SignedInt);

    QAudioDeviceInfo info(QAudioDeviceInfo::defaultOutputDevice());
    if (!info.isFormatSupported(format)) {
        qWarning()<<"raw audio format not supported by backend, cannot play audio.";
        return;
    }

    qAudioOutput = new QAudioOutput(format, NULL);

    qAudioDevice=qAudioOutput->start();
Run Code Online (Sandbox Code Playgroud)

然后

void Enqueue(TYPESAMPLEPCM *data,int countBytes){
    while(qAudioOutput->bytesFree()<countBytes){
          Sleep(1);
    }
    qAudioDevice->write((char *)data,countBytes);
}
Run Code Online (Sandbox Code Playgroud)

数据块是256字节(128个样本,它们的"粒度"约为6毫秒.

从具有高优先级的线程中的循环调用Enqueue,该线程提供数据块.它没有延迟,因为它所谓的Enqueue速度远远快于渲染音频数据.

但它看起来有一个缓冲不足的情况,因为声音播放,但有一种"噼里啪啦"的常规噪音.

如果我将块大小提高到256个样本,问题几乎消失了.开头只有一些噼啪声(?)

该平台是Windows和Qt 5.3.

这是正确的程序还是我遗漏了什么?

c++ audio streaming qt low-latency

5
推荐指数
1
解决办法
4122
查看次数

这个64位数字变量多线程规则在Java 1.8中是否仍然适用,或者它是否已过时?

来自Goetz,Peierls,Bloch等.2006:实践中的Java并发

3.1.2.非原子64位操作

当一个线程在没有同步的情况下读取一个变量时,它可能会看到一个陈旧的值,但至少它会看到某个线程实际放置的值而不是某个随机值.这种安全保证称为超薄空气安全.

超薄空气安全适用于所有变量,但有一个例外:未声明为volatile的64位数字变量(double和long)(参见第3.1.4节).Java内存模型要求获取和存储操作是原子操作,但对于非易失性长和双变量,JVM允许将64位读或写视为两个独立的32位操作.如果读取和写入发生在不同的线程中,则可以读取非易失性long并返回一个值的高32位和另一个值的低32位.[3]

因此,即使您不关心陈旧值,在多线程程序中使用共享的可变长和双变量也是不安全的,除非它们被声明为volatile或由锁保护.

[3] 当编写Java虚拟机规范时,许多广泛使用的处理器体系结构无法有效地提供原子64位算术运算.

这是在2004年发布的Java 5发布之后编写的,其中许多更改都是​​针对更容易的多线程和并发编程.那为什么它仍然适用?即便在十年后呢?

如果只是因为可以在32位硬件上运行Java应用程序,为什么没有JVM运行时选项允许它?

能够编写多线程和低延迟应用程序而不用担心这个问题是不是有益处?

java memory multithreading low-latency

5
推荐指数
1
解决办法
446
查看次数

使用 gstreamer 进行低延迟音频捕获

我需要在 Linux 上使用gstreamer. 我的问题是我无法将延迟降低到约 210 毫秒以下。我尝试了从麦克风到耳机的简单环回:

gst-launch-1.0 pulsesrc ! alsasink
gst-launch-1.0 alsasrc ! alsasink
Run Code Online (Sandbox Code Playgroud)

两者都产生相同的延迟。latency-time的属性没有alsasrc帮助(它确实增加了给定的延迟)。我可以产生我需要的效果

pactl load-module module-loopback latency_msec=1
Run Code Online (Sandbox Code Playgroud)

但我不知道是否可以pulsesrcgstreamer. 我想,如果可能的话,我应该添加一些东西stream-properties,但无法弄清楚什么(我在这里搜索)以及如何添加。

是否可以为任何源设置此设备延迟?gstreamer如果可以,如何设置?

audio gstreamer low-latency

5
推荐指数
1
解决办法
6505
查看次数

最小化WebSocket客户端延迟的一些经验法则是什么?

我目前正致力于延迟关键应用程序.在分析我的代码之后,我得出结论,瓶颈可能与我的WebSocket客户端有关.我不控制服务器,只控制客户端.

上下文

我在与服务器相同的可用区域中运行带有ENA(弹性网络适配器)的c5d.xlarge Ubuntu实例.如果我从我的实例ping服务器,则延迟低于1毫秒(通常在0.2到0.5毫秒之间).我的代码是用Haskell编写的,这是我使用的WebSocket库:http://hackage.haskell.org/package/websockets 服务器发送的消息时间戳和我收到消息后创建的时间戳之间的差异通常在下面10毫秒对我来说足够好了.但是,有时这个时间差会增加到4-500毫秒甚至更差(超过1-1.5秒).我怀疑当服务器必须处理增加的活动时会发生这种情况,因此当服务器负载很重时.尽管我没有发现任何迹象表明它可能是我的代码,我的实例设置或两者的组合导致了这种延迟峰值,但我仍然持怀疑态度,因此我前往https://websocket.org/echo来自我的本地计算机(Mac)的.html,以便检查那里的延迟(使用Chrome作为我的浏览器).由于这比我的实例更远离服务器,因此延迟稍高,但通常低于50毫秒.这里也发生了4-500毫秒的延迟峰值.

再生产

在Chrome中,转到https://websocket.org/echo.html并连接到:wss://www.bitmex.com/realtime 最后,将以下消息发送到服务器并检查Chrome Developer Tools中"网络"选项卡下的WebSocket框架:

{"op": "subscribe", "args": ["orderBook10:XBTUSD"]}

有没有办法在这种情况下进一步减少延迟?在配置我可能缺少的WebSocket客户端连接时是否有任何经验法则?我尝试使用WebSocket压缩扩展,但似乎没有帮助.我觉得我无能为力,因为服务器不受我的控制.谢谢!

networking haskell algorithmic-trading websocket low-latency

5
推荐指数
0
解决办法
568
查看次数