谁能给我一些关于学习如何进行极低延迟编程的最佳方法的指示?我有很多编程书籍,但我从来没有见过一个专注于(或帮助)编写极快代码的书籍.或者书籍不是最好的前进方式?
非常感谢专家的一些建议!
编辑:我想我更多地指CPU /内存绑定.
我需要单生成器,单用户FIFO查询,因为
所以它非常像我认为的TCP/IP,你有一个生产者和一个消费者,有时你可以比你可以处理的更快地接收消息,所以你必须查询它们.在哪里订单很重要,并且调用者绝对不感兴趣你用这些东西做什么.
这听起来很容易,我可能会使用一般Queue,但我想用BlockingCollection它,因为我不想写任何代码ManualResetEvent等.
如何适合BlockingCollection我的任务,可能你可以推荐别的东西?
如何向StringBuilder添加一定数量(1到100之间)的空格?
StringBuilder nextLine = new StringBuilder();
string time = Util.CurrentTime;
nextLine.Append(time);
nextLine.Append(/* add (100 - time.Length) whitespaces */);
Run Code Online (Sandbox Code Playgroud)
什么是"理想"的解决方案?for循环是丑陋的.我也可以创建whitespaces[i]包含完全包含i空格的字符串的数组,但这将是相当长的硬编码数组.
我有这样的错误
错误8'c:\ Oleg\projects\MBClient\packages\Disruptor.1.1.0\lib \net40\Atomic.dll'和'c:\ Program Files(x86)中都存在'System.Threading.Volatile'类型\ Reference Assemblies\Microsoft\Framework.NETFramework\v4.5\mscorlib.dll'C:\ Oleg\projects\MBClient\MBClient\CustomIndeces\CompositeIndex.cs 77 40 MBClient
我不知道该怎么办,因为完全限定名称并不能准确识别要使用的类.如何解决这个问题呢?
在这个例子中/sf/answers/698624251/和这里为什么我的破坏者示例如此之慢?(在问题的最后)有1个发布者发布项目和1个消费者.
但就我而言,消费者工作要复杂得多,需要一些时间.所以我想要4个并行处理数据的消费者.
因此,例如,如果生产者产生数字:1,2,3,4,5,6,7,8,9,10,11 ..
我希望consumer1能够捕获1,5,9,... consumer2捕获2,6,10,... consumer3捕获3,7,11,... consumer4捕获4,8,12 ......(不完全是这些数字,这个想法是数据应该并行处理,我不关心在哪个消费者处理哪个数字)
并且记住这需要并行完成,因为在实际应用中,消费者工作非常昂贵.我希望消费者能够在不同的线程中执行以使用多核系统的功能.
当然我可以创建4个环形缓冲区并将1个消费者连接到1个环形缓冲区.这样我可以使用原始示例.但我觉得这不对.可能创建1个发布者(1个铃声缓冲器)和4个消费者是正确的 - 因为这是我需要的.
添加指向Google群组中非常类似问题的链接:https://groups.google.com/forum/#!msg/lmax-disruptor/-CLapWuwWLU/GHEP4UkxrAEJ
所以我们有两个选择:
似乎所有主要的投资银行都在Unix(Linux,Solaris)中使用C++来实现低延迟/高频服务器应用.人们如何在交易高频权益时实现低延迟?任何书都教会如何实现这一目标?
在args4j中我定义了这样的选项:
@Option(name="-host",usage="host to connect")
@Option(name="-port",usage="port of the host")
@Option(name="-idle",usage="idle")
Run Code Online (Sandbox Code Playgroud)
但是,当显示帮助时,args4j始终按字母顺序使用,以便打印
-host - host to connect
-idle - idle
-port - port to connect
Run Code Online (Sandbox Code Playgroud)
这不方便,因为我想首先显示强制选项.另外我想自己设置选项的顺序,因为一些选项(如主机和端口)应该一起使用.
如何控制args4j中的选项顺序?
我在3年前发现了同样的问题,但没有回答http://markmail.org/message/xce6vitw6miywtos
我的一个类在应用程序执行期间收集统计信息,我希望在应用程序完成时将此统计信息存储到磁盘.我从来没有在我的程序中销毁这个类,所以我试图将日志存储到文件中:
~Strategy()
{
foreach(var item in statisticItems)
{
log.WriteLine(item.Text); // log is AutoFlush
}
}
Run Code Online (Sandbox Code Playgroud)
但是我没有看到我期望看到的日志,并且在析构函数调用时我也无法在调试器中"捕获".
问题:
我想让我的课堂不变.显而易见的方法是将所有字段声明为get; private set;并初始化构造函数中的所有字段.所以客户必须在构造函数中提供所有内容 问题是,当构造函数中有大约10个或更多字段传递它们变得非常难以理解时,因为每个字段都没有标签.
例如,这很可读:
info = new StockInfo
{
Name = data[0] as string,
Status = s,
LotSize = (int)data[1],
ISIN = data[2] as string,
MinStep = (decimal)data[3]
};
Run Code Online (Sandbox Code Playgroud)
与此相比:
new StockInfo(data[0] as string, s, (int) data[1], data[2] as string, (decimal) data[3])
Run Code Online (Sandbox Code Playgroud)
现在成像我有10个或更多参数.
那么如何才能使类不可变保存可读性?
我建议只在使用构造函数时使用相同的格式:
info = new StockInfo(
data[0] as string, // Name
s, // Status
(int)data[1], // LotSize
data[2] as string, // ISIN
(decimal)data[3] // MinStep
);
Run Code Online (Sandbox Code Playgroud)
你能提出更好的建议吗?
我的程序经常因某种原因崩溃。在这种情况下,我确实看到带有“关闭”按钮的 Windows 消息。每次发生这样的事情,我真的很想知道发生了什么。
感谢社区,我已经知道如何“处理”某些情况,我在程序的开头添加了这样的代码:
static void Main(string[] args)
{
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
TaskScheduler.UnobservedTaskException +=
(object sender, UnobservedTaskExceptionEventArgs excArgs) =>
{
Log.Push(LogItemType.Error, "Exception occured. Task terminated! + " + excArgs.Exception);
excArgs.SetObserved();
};
.....
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Console.WriteLine("Error: CurrentDomain_UnhandledException entered.");
string message = (e.ExceptionObject as Exception).Message;
Console.WriteLine(message);
System.Diagnostics.Trace.WriteLine(message, "Unhandled UI Exception");
Log.Push(LogItemType.Error, message);
}
Run Code Online (Sandbox Code Playgroud)
有时这会有所帮助。但有时程序会崩溃而没有消息。我还可以做些什么?每次程序崩溃我都想知道为什么。
upd Windows 日志包含我需要的几乎所有东西,除了最重要的东西 - 堆栈跟踪
Faulting application name: MBClient.exe, version: 1.0.0.0, time stamp: 0x50a5da1d
Faulting module name: ntdll.dll, version: 6.1.7601.17725, time stamp: 0x4ec4aa8e …Run Code Online (Sandbox Code Playgroud)