标签: low-latency

C++低延迟设计:用于工厂实现的函数调度v/s CRTP

作为系统设计的一部分,我们需要实现工厂模式.结合Factory模式,我们还使用CRTP来提供一组基本功能,然后可以通过Derived类进行自定义.

示例代码如下:

class FactoryInterface{
    public:
     virtual void doX() = 0;
};

//force all derived classes to implement custom_X_impl 
template< typename Derived, typename Base = FactoryInterface>
class CRTP : public Base 
{
    public:
    void doX(){
        // do common processing..... then
        static_cast<Derived*>(this)->custom_X_impl();
    }
};

class Derived: public CRTP<Derived>
{
    public:
        void custom_X_impl(){
        //do custom stuff
        }
};
Run Code Online (Sandbox Code Playgroud)

虽然这种设计很复杂,但它确实提供了一些好处.初始虚函数调用之后的所有调用都可以内联.派生类custom_X_impl调用也是有效的.

我编写了一个比较程序来比较使用函数指针和虚函数的类似实现(紧密循环,重复调用)的行为.这个设计为gcc/4.8与O2和O3取得了胜利.

然而,C++专家昨天告诉我,大型执行程序中的任何虚函数调用都需要一个可变的时间,考虑到缓存未命中,我可以使用C样式函数表查找和gcc函数列表来实现更好的性能.但是我仍然看到上面提到的示例程序的成本的2倍.

我的问题如下:1.大师的断言是真的吗?对于任何一个答案,我可以参考任何链接.2.我是否可以参考任何低延迟实现,有一个基类使用函数指针在派生类中调用自定义函数?3.有关改进设计的建议吗?

任何其他反馈总是受欢迎的.

c++ gcc class-design crtp low-latency

9
推荐指数
1
解决办法
1022
查看次数

为什么Windows7上的TCP/IP需要500个预热才能进行预热?(w10,w8证明不会受到影响)

我们看到ZeroMQ上有一个奇怪且无法解释的现象,Windows 7通过TCP发送消息.(或者inproc,因为ZeroMQ在Windows内部使用TCP进行信令).

这种现象是前500条消息越来越慢,延迟越来越慢.然后,除了由CPU /网络争用引起的峰值之外,延迟下降和消息一直快速到达.

这里描述了这个问题:https://github.com/zeromq/libzmq/issues/1608

它始终是500条消息.如果我们发送没有延迟,那么消息被批处理,所以我们看到这个现象延伸了几千个发送.如果我们在发送之间延迟,我们会更清楚地看到图表.即使在发送之间延迟多达50-100毫秒也不会改变事情.

邮件大小也无关紧要.我已经测试了10字节消息和10K消息,结果相同.

最大延迟始终为2毫秒(2,000 usec).

在Linux机器上,我们没有看到这种现象.

我们想要做的是消除这个初始曲线,因此消息与正常的低延迟(大约20-100 usec)保持新的连接.


更新:该问题不会在Windows 10和8上显示.它似乎发生在Windows 7上.

tcp winsock distributed-computing zeromq low-latency

9
推荐指数
1
解决办法
533
查看次数

为什么JVM在繁忙的旋转暂停后对同一代码块显示更多延迟?

下面的代码明确地说明了问题,即:

繁忙的旋转暂停后,完全相同的代码块变慢.

请注意,我当然不会使用Thread.sleep.另请注意,没有条件导致HotSpot/JIT去优化,因为我正在使用数学运算更改暂停,而不是IF.

  • 我想要一个数学运算块.
  • 首先,我在开始测量之前将块暂停1纳秒.我这样做了20,000次.
  • 然后我将暂停从1纳秒更改为5秒,然后像往常一样继续测量延迟.我这样做了15次.
  • 然后我打印最后30次测量,这样你可以看到15次测量,暂停1纳秒,15次测量,暂停5秒.

正如您在下面所看到的,差异很大,特别是在暂停变化后的第一次测量中.这是为什么!?

$ java -server -cp . JvmPauseLatency
Sat Apr 29 10:34:28 EDT 2017 => Please wait 75 seconds for the results...
Sat Apr 29 10:35:43 EDT 2017 => Calculation: 4.0042328611017236E11
Results:
215
214
215
214
215
214
217
215
216
214
216
213
215
214
215
2343 <----- FIRST MEASUREMENT AFTER PAUSE CHANGE
795
727
942
778
765
856
762
801
708
692
765 …
Run Code Online (Sandbox Code Playgroud)

java optimization jvm real-time low-latency

9
推荐指数
1
解决办法
518
查看次数

为什么Google公共DNS(8.8.8.8)的ping延迟如此之低?

我使用just-ping ping Google公共DNS服务器,IP为8.8.8.8. just-ping可以ping全球50个地点的主机.

我发现全世界的DNS延迟很低.许多城市彼此相距很远,但他们在ping中的延迟相同(约5ms).

我想IP 8.8.8.8是针对一个主机的.主机如何反应如此之快,即使它远离客户?

谢谢!

dns host ping low-latency

8
推荐指数
1
解决办法
2万
查看次数

Tomcat零星延迟

我一直在微观优化我们在Tomcat上的页面响应时间,几乎在所有情况下,如果我反复刷新,我会看到50ms的响应时间,但如果页面没有被击中一两秒,则响应时间会跳回来到500ms.

我看到了同样的行为,无论是本地的,不是本地的,APR,NIO,JIO,静态或动态响应(即提供静态文件或动态处理响应).到目前为止,我还没有看到这种行为不会发生在Tomcat上(无论频率如何,这都是一致的400ms).

我也使用Visual VM来查看是否有任何线索.

我认为这是一种保持活力,但是当我运行Apache Bench时,我的响应时间更快(低于50ms)(显然是因为它频繁地击中它).

那么如何在Tomcat中保持低延迟不频繁命中的URL?也许这个问题更适合ServerFault?

更新:我几乎肯定它是一个Tomcat 6问题.我以为我已经在Tomcat 7上进行了测试,但我刚刚对它进行了测试并且没有问题(见下面的结果).即使是最新的Tomcat 6仍然存在这个问题.

这是abTomcat 6 的输出(注意最大值):

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:    14   39  45.2     30     314
Waiting:       14   38  45.2     30     314
Total:         14   39  45.2     30     314
Run Code Online (Sandbox Code Playgroud)

这是abTomcat 7的输出通知最大值:

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:    25   38   8.8     37      67
Waiting:       25   37 …
Run Code Online (Sandbox Code Playgroud)

java performance tomcat tomcat6 low-latency

8
推荐指数
1
解决办法
1150
查看次数

Java TCP/IP Socket写性能优化

服务器环境

Linux/RedHat
6 cores
Java 7/8
Run Code Online (Sandbox Code Playgroud)

关于申请:

我们正在开发一个使用Java的低延迟(7-8毫秒)高速交易平台.在满足算法条件后发送多腿订单

问题

使用TCP/IP java.net.SocketAPI(使用java.io.OutputStream.write(bytes[] arg0))向交换机发出的订单.Profiler测量记录为5-7微秒,根据我们的低延迟要求,这是非常高的.我们没有像在stacktrace中发布的一个问题中所建议的那样使用setPerformancePreferences()api.

  1. java.net.Socket的任何替代方法都可以减少套接字传输时间?
  2. 任何优化技术,以提高性能
  3. setPerformancePreferences()有用吗?

java performance tcp low-latency socket.io

8
推荐指数
1
解决办法
3067
查看次数

低延迟网络建议(s/w和h/w)

我想知道各种技术/提示/技巧/银子弹在调查网络延迟问题以及各种解决方案和优化时所使用的SO.

我正在寻找可以应用于软件或硬件的解决方案.

例如:

  1. 增加套接字缓冲区大小
  2. 使用OS的反应器模式的最佳选项(选择并不总是最佳选择)
  3. 使用极端终端NIC,如bigf​​oot Killer 2100
  4. 保持网线尽可能短,不要将网线相互缠绕在一起
  5. 在2点之间复制大量数据时 - 考虑往返延迟并使用多个套接字连接以完全饱和链接

还有什么其他建议?

language-agnostic networking low-latency

7
推荐指数
1
解决办法
801
查看次数

学习如何编写延迟关键,快速C++/Java/C#代码的最佳方法?

谁能给我一些关于学习如何进行极低延迟编程的最佳方法的指示?我有很多编程书籍,但我从来没有见过一个专注于(或帮助)编写极快代码的书籍.或者书籍不是最好的前进方式?

非常感谢专家的一些建议!

编辑:我想我更多地指CPU /内存绑定.

c# c++ java low-latency

7
推荐指数
2
解决办法
1万
查看次数

如何减少实时平滑流式会议解决方案中的延迟?

我正在使用Expression Encoder SDK对我的网络摄像头进行实时录制,将其发布到支持IIS 7.5和Media Services 4的Web服务器,并使用SmoothStreamingClient进行查看.

但是,由于我的目标是实时会议解决方案,我需要大幅减少本地预览和远程播放之间的20秒延迟.

我在某些地方读过可以配置实时平滑流以获得2秒的延迟,但是,我没有找到任何教程解释如何配置这样的解决方案,包括编码,提供和消费双方.

这是我用来编码捕获的视频的代码:

// Aquires audio and video devices
EncoderDevice video = EncoderDevices.FindDevices(EncoderDeviceType.Video).Count > 0 ? EncoderDevices.FindDevices(EncoderDeviceType.Video)[0] : null;
EncoderDevice audio = EncoderDevices.FindDevices(EncoderDeviceType.Audio).Count > 0 ? EncoderDevices.FindDevices(EncoderDeviceType.Audio)[0] : null;

// Create a new device source. We use the first audio and video devices on the system
job = new LiveJob();
LiveDeviceSource deviceSource = job.AddDeviceSource(video, audio);

// sets preview window to winform panel hosted by xaml window
deviceSource.PreviewWindow = new PreviewWindow(new HandleRef(prevWindow, prevWindow.GetHandle));

// Make …
Run Code Online (Sandbox Code Playgroud)

iis streaming smooth low-latency expression-encoder

7
推荐指数
1
解决办法
1855
查看次数

同一进程中线程之间的低延迟通信

控制台应用程序有3个线程:Main,T1,T2.目标是尽可能以最低延迟(μs)从主线程"发信号"T1,T2(并让它们做一些工作)

注意:

  • 请忽略抖动,GC等(我可以处理)
  • ElapsedLogger.WriteLine通话费用低于50ns(纳秒)

看看下面的代码:

样品1

class Program
{
    private static string msg = string.Empty;
    private static readonly CountdownEvent Countdown = new CountdownEvent(1);

    static void Main(string[] args)
    {
        while (true)
        {
            Countdown.Reset(1);
            var t1 = new Thread(Dowork) { Priority = ThreadPriority.Highest };
            var t2 = new Thread(Dowork) { Priority = ThreadPriority.Highest };
            t1.Start();
            t2.Start();

            Console.WriteLine("Type message and press [enter] to start");
            msg = Console.ReadLine();

            ElapsedLogger.WriteLine("Kick off!");
            Countdown.Signal();

            Thread.Sleep(250);
            ElapsedLogger.FlushToConsole();
        }
    }
    private static void Dowork()
    {
        string t = Thread.CurrentThread.ManagedThreadId.ToString(); …
Run Code Online (Sandbox Code Playgroud)

c# performance multithreading ipc low-latency

7
推荐指数
1
解决办法
1042
查看次数