作为系统设计的一部分,我们需要实现工厂模式.结合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.有关改进设计的建议吗?
任何其他反馈总是受欢迎的.
我们看到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上.
下面的代码明确地说明了问题,即:
繁忙的旋转暂停后,完全相同的代码块变慢.
请注意,我当然不会使用Thread.sleep.另请注意,没有条件导致HotSpot/JIT去优化,因为我正在使用数学运算更改暂停,而不是IF.
正如您在下面所看到的,差异很大,特别是在暂停变化后的第一次测量中.这是为什么!?
$ 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) 我一直在微观优化我们在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) 服务器环境
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.
题
我想知道各种技术/提示/技巧/银子弹在调查网络延迟问题以及各种解决方案和优化时所使用的SO.
我正在寻找可以应用于软件或硬件的解决方案.
例如:
还有什么其他建议?
谁能给我一些关于学习如何进行极低延迟编程的最佳方法的指示?我有很多编程书籍,但我从来没有见过一个专注于(或帮助)编写极快代码的书籍.或者书籍不是最好的前进方式?
非常感谢专家的一些建议!
编辑:我想我更多地指CPU /内存绑定.
我正在使用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) 控制台应用程序有3个线程:Main,T1,T2.目标是尽可能以最低延迟(μs)从主线程"发信号"T1,T2(并让它们做一些工作)
注意:
看看下面的代码:
样品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) low-latency ×10
java ×4
performance ×3
c# ×2
c++ ×2
tcp ×2
class-design ×1
crtp ×1
dns ×1
gcc ×1
host ×1
iis ×1
ipc ×1
jvm ×1
networking ×1
optimization ×1
ping ×1
real-time ×1
smooth ×1
socket.io ×1
streaming ×1
tomcat ×1
tomcat6 ×1
winsock ×1
zeromq ×1