【问题标题】:Performance Lack in my C++ Code [closed]我的 C++ 代码中缺乏性能 [关闭]
【发布时间】:2014-07-07 07:25:56
【问题描述】:

目前我正在尝试优化我的 c++ 代码以获得更好的性能,因为我有很强的 java/c# 背景。 我已经测试了类之间的 getter/setter 等简单示例,并通过如下引用实现了使用它们:

vector<string>& MyClass::getNum()
{
   return num;
}

void MyClass::setNum(vector<string> &num)
{
   this->num = num;
}

(假设向量中有 15 个以上的字符串)

比没有时快 2 倍。 (使用简单/小参数时没有区别,但使用向量等时差异很大)

我也在 Java 中尝试了相同的示例,但不知何故,我的 Java 代码仍然比 C++ 中的要快。 有人可以帮助我吗?

【问题讨论】:

  • 很想看看你的基准测试。
  • 你一直在使用什么优化级别?
  • 这个问题目前缺乏很多可以回答的信息。答案目前唯一能做的就是推测。
  • 除非您的优化级别太低,否则int&amp;int 在性能方面应该没有区别
  • 我们无法审查我们看不到的代码。

标签: c++ performance


【解决方案1】:

在java中,一切都是指针,所以当你在java中这样做时:

void function (ArrayList <Integer> myList);

在 C++ 中几乎等同于:

void function (std::vector <int> & myList);
void function (std::vector <int> * myList);

这回答了关于为什么 Java 在 C++ 中不使用引用时更快的问题,因为在大多数情况下引用更快。那么,为什么它会提高性能呢?

好吧,假设你有一个 int 向量,如果你将它传递给一个没有引用的函数,你必须制作一个对象的副本(调用复制构造函数),这需要(通常)大量的时间因为您必须分配一个新数组等。另一个结构示例:

struct X {
    int a[100] ;
    int b[100] ;
} ;

这个结构在现代机器上采用类似2 * 100 * 4 = 800字节的东西(当然可能会有所不同),所以如果你将它传递给这样的函数:

void function (X x) ;

调用该函数时,需要进行复制,所以复制800 bytes,如果这样做:

void function (X const& x) ;

您只传递对对象的引用,即指向对象的东西,这将占用(在 x64 架构上)8 个字节。

【讨论】:

  • 他从不问“为什么 C# 和 Java 没有区别?”。他在问为什么他的 Java 代码比他的 C++ 代码快。与 C# 无关。
  • 我已经尝试使用函数参数有参考,完全没有区别。
  • 我还在某处找到了这段文字:因为引用通常由 C++ 使用指针实现,并且取消引用指针比直接访问它慢,访问通过引用传递的值比访问通过引用传递的值慢价值。
【解决方案2】:

this-&gt;num = num;:这一行复制你通过引用传递的向量。如果您的目标是将向量提供给MyClass 然后忘记它,请考虑通过右值引用传递它并移动它。

【讨论】:

  • 或者,更好的是,通过值传递它然后移动它。
  • @Puppy 那不也复印吗?
  • @Quentin 没有。如果可能,按值传递调用移动构造函数。总而言之,如果你想 store 一些东西,你需要一个该东西的 instance ,而放置该实例的“最外面”的方式是在参数列表中。参考this question of mine
  • @BartekBanachewicz 所以如果我的理解是正确的,按值传递意味着我得到参数的副本或参数本身,这取决于调用者是否想要保留它?整洁!
猜你喜欢
  • 1970-01-01
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-13
  • 2011-11-02
相关资源
最近更新 更多