首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该尽量避免超低延迟软件中的“新”关键字吗?

我应该尽量避免超低延迟软件中的“新”关键字吗?
EN

Stack Overflow用户
提问于 2013-01-09 17:36:38
回答 3查看 1.7K关注 0票数 3

我在写高频交易软件。我关心的是每一秒。现在它已经写在C#上了,但是我很快就会迁移到C++。

让我们考虑一下这样的代码

代码语言:javascript
复制
// Original
class Foo {
....

    // method is called from one thread only so no need to be thread-safe
    public void FrequentlyCalledMethod() {
        var actions = new List<Action>();
        for (int i = 0; i < 10; i++) {
            actions.Add(new Action(....));
        }
        // use actions, synchronous
        executor.Execute(actions);
        // now actions can be deleted
    }

我猜超低延迟软件不应该过多地使用"new“关键字,所以我将actions移到了一个字段:

代码语言:javascript
复制
// Version 1
class Foo {
....

    private List<Action> actions = new List<Action>();

    // method is called from one thread only so no need to be thread-safe
    public void FrequentlyCalledMethod() {
        actions.Clear()
        for (int i = 0; i < 10; i++) {
            actions.Add(new Action { type = ActionType.AddOrder; price = 100 + i; });
        }
        // use actions, synchronous
        executor.Execute(actions);
        // now actions can be deleted
    }

也许我应该尽量避免使用“新”关键字?我可以使用一些预先分配对象的“池”:

代码语言:javascript
复制
// Version 2
class Foo {
....

    private List<Action> actions = new List<Action>();
    private Action[] actionPool = new Action[10];

    // method is called from one thread only so no need to be thread-safe
    public void FrequentlyCalledMethod() {
        actions.Clear()
        for (int i = 0; i < 10; i++) {
            var action = actionsPool[i];
            action.type = ActionType.AddOrder;
            action.price = 100 + i;
            actions.Add(action);
        }
        // use actions, synchronous
        executor.Execute(actions);
        // now actions can be deleted
    }
  • 我该走多远?
  • 避免new的重要性
  • 在使用只需要配置的预先分配的对象时,我会赢得什么吗?(在上面的例子中设置类型和价格)

请注意,这是超低延迟,所以让我们假设性能优先于可读性、可维护性等等。

EN

回答 3

Stack Overflow用户

发布于 2013-01-09 17:49:26

在C++中,您不需要new来创建一个范围有限的对象。

代码语言:javascript
复制
void FrequentlyCalledMethod() 
{
    std::vector<Action> actions;
    actions.reserve( 10 );
    for (int i = 0; i < 10; i++) 
    {
        actions.push_back( Action(....) );
    }
    // use actions, synchronous
    executor.Execute(actions);
    // now actions can be deleted
}

如果Action是一个基类,并且实际的类型是派生类,那么这里需要一个指针或智能指针以及new。但是如果Action是一个具体的类型,并且所有的元素都是这种类型,并且如果这个类型是默认的--可构造的、可复制的和可分配的,那么就不需要了。

但是,通常情况下,不使用新的技术很不可能带来性能上的好处。在C++中,当本地函数作用域是对象的作用域时,使用本地函数作用域是一个很好的实践。这是因为在C++中,您必须更多地管理资源,这是使用一种称为"RAII“的技术来完成的--这实际上意味着在分配时考虑如何删除资源(通过对象的析构函数)。

高绩效更有可能通过以下途径实现:

  • 正确使用算法
  • 适当的并行处理和同步技术
  • 有效的缓存和惰性评估。
票数 4
EN

Stack Overflow用户

发布于 2013-01-09 18:46:00

尽管我非常讨厌HFT,但我要告诉你如何从给定的铁条上的每一个线程中获得最大的性能。

一个例子的https://scicomp.stackexchange.com/a/1870/1262,在这个例子中,最初编写的程序的速度是原来的730倍。

你分阶段做。在每一个阶段,你都会找到一些需要很长时间的东西,然后你就会修复它。关键字查找,而不是猜测。太多的人只是盯着代码,修正他们认为会有帮助的东西,而且常常但并不总是有帮助的,有些人。这是猜测。要得到真正的加速,你需要找到所有的问题,而不仅仅是少数你可以猜到的问题。

如果你的程序正在做新的事情,那么在某个时候,你需要修复的就是这个机会。但这不是唯一的事。

这是https://scicomp.stackexchange.com/a/2719/1262

票数 2
EN

Stack Overflow用户

发布于 2014-01-29 15:55:31

对于高性能的交易引擎在好的高频交易商店,避免新的/ C++代码是一个基本的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14243128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档