我需要生成大约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.
我一直在研究各种第三方库和 .Net 中低延迟串行通信的方法。我读了足够多的书,现在已经回到原点,由于各种相互冲突的观点,我所知道的和刚开始时一样少。
例如,框架中的功能被排除,因为一些令人信服的文章指出:“微软提供的解决方案在框架版本之间不稳定,并且缺乏功能。”
我发现文章抨击了许多旧的基于 COM 的库。我发现一些文章抨击了由于垃圾收集而导致整个 .Net 应用程序低延迟的想法。
我还读过一些文章,展示了如何为了低延迟通信的目的而调用 Windows API 功能是不可接受的。
这排除了我能想到的任何方法!
我真的很感谢那些经历过/经历过这种经历的人的一些话。理想情况下,我可以找到一个可靠的库/合作伙伴,而不必自己构建通信库。我有以下简单的目标:
非常感谢任何可能消除我的困惑的评论、想法、想法或文章链接!
我正在尝试测量我无法控制的服务器的延迟.这是在共同定位的环境中,因此延迟大约为500 us(.5 ms).
据我所知,思科设备经常优先考虑ICMP流量,使ping时间不可靠.有没有办法让我知道我正在穿越的装备是否就是这种情况?
我可以使用TCP确认来确定远程服务器的最小延迟吗?为此,我会以某种方式强制远程服务器在接收我的数据时立即发送TCP确认.
我正在考虑为即将推出的Windows 8开发应用程序.该应用程序需要低延迟的音频录制和回放,我正在尝试找出操作系统是否会支持(与其他平台相反).
所以我想知道的是:
谢谢!
让任何人开始的简单问题:
我知道我需要一个特殊的网络接口卡(nic)才能做到这一点.我假设它必须是SolarFlare制造的.我能得到的最便宜的是什么才能让我实现并测试内核旁路?
看起来他们使用OpenOnLoad作为网络堆栈.在哪里可以找到有关如何使用OpenOnLoad使用我的网络应用程序的示例代码和示例?我很想知道我的程序使用这项技术是多么容易或复杂.
问题来自于这个问题:Java中的内核绕过网络
问题:
3下面的循环包含已注释掉的代码.我搜索("TAG1","TAG2"和"TAG3")以便于识别.我只是希望while循环在测试的条件下等待,然后继续进行,同时尽可能地减少CPU资源.我首先尝试使用Boost条件变量,但是存在竞争条件.让线程休眠'x'微秒是低效的,因为没有办法精确计时唤醒.最后,boost :: this_thread :: yield()似乎没有做任何事情.可能是因为我在双核系统上只有2个活动线程.具体来说,如何在引入尽可能少的不必要阻塞的同时,使下面的三个标记区域更有效地运行.
背景
目的:
我有一个记录大量数据的应用程序.在分析之后,我发现在日志记录操作上花费了很多时间(将文本或二进制文件记录到本地硬盘上的文件中).我的目标是通过使用线程缓冲流记录器的调用替换非线程直接写入调用来减少logData调用的延迟.
选项探索:
设计:
结果:
使用当前版本的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) 我想播放实时响应,没有明显的用户交互延迟.
为了获得低延迟,我必须发送一小块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.
这是正确的程序还是我遗漏了什么?
来自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运行时选项允许它?
能够编写多线程和低延迟应用程序而不用担心这个问题是不是有益处?
我需要在 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)
但我不知道是否可以pulsesrc为gstreamer. 我想,如果可能的话,我应该添加一些东西stream-properties,但无法弄清楚什么(我在这里搜索)以及如何添加。
是否可以为任何源设置此设备延迟?gstreamer如果可以,如何设置?
我目前正致力于延迟关键应用程序.在分析我的代码之后,我得出结论,瓶颈可能与我的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
low-latency ×10
audio ×3
c++ ×3
java ×2
networking ×2
.net ×1
asynchronous ×1
boost ×1
c ×1
gstreamer ×1
hash ×1
haskell ×1
latency ×1
memory ×1
modulo ×1
openonload ×1
performance ×1
qt ×1
real-time ×1
serial-port ×1
streaming ×1
tablet ×1
tcp ×1
websocket ×1
windows-8 ×1