【问题标题】:Class methods VS Class static functions VS Simple functions - Performance-wise?类方法 VS 类静态函数 VS 简单函数 - 性能方面?
【发布时间】:2012-12-02 04:10:00
【问题描述】:

好的,这就是我想要的:

  • 我已经编写了几个要求非常高的函数(主要是在位图上操作等),它们必须尽可能快
  • 现在,我们还要提一下,这些函数也可以按类型分组,甚至可以按它们所操作的变量的类型分组。
  • 问题是,除了算法的实现之外,我应该做些什么 - 从技术角度来看 - 为了不影响速度。

现在,我正在考虑以下场景

  • 将它们创建为简单的函数,并将必要的参数作为参数传递
  • 创建一个类(用于“分组”/组织目的)并将它们声明为静态
  • 按类型创建类,例如创建一个用于处理位图的类,为每个位图创建一个该类的新实例(例如Bitmap* myBitmap = newBitmap(1010);,并使用其内部方法对其进行操作(例如myBitmap->getFirstBitSet()

现在,哪种方法最快?在性能方面,直接简单函数和类封装static 函数之间真的有什么区别吗?还有其他我没有提到的更可取的方案吗?


旁注:我正在为 Mac OS X 10.6.8 使用 clang++ 编译器。 (如果这有什么不同的话)

【问题讨论】:

  • 如果您真的关心性能,您应该在您的环境中分析您建议的两个版本。这样您可以获得一个很好的诊断,而不是仅仅猜测这里的答案会为您提供哪些。跨度>
  • @LuchianGrigore+AlokSave 老实说,不,我没有运行任何分析测试。是的,我知道有些事情最好根据它们应该运行的确切环境进行诊断;我想我需要对我的困境背后的一些理论提出一些意见,我可能会失踪。 (例如,即使我已经考虑过了,类创建和方法调用会比简单的函数调用更快吗?还在猜测……虽然我认为我猜对了……)跨度>
  • 没有分析,如果你的成员是虚函数(或者如果你的类有虚函数),只有主要的性能成本才会出现
  • 我会为可读性编写代码并将调用抽象出来,这样当您进行分析时,很容易更改和测试替代方案。

标签: c++ c macos class clang


【解决方案1】:

在 CPU 级别,只有one kind of function,它非常类似于 C 类。你可以自己制作,但是......

事实证明,C++ 以高效为理念构建,将大多数函数直接映射到 call 指令:

  • 命名空间级别的函数就像普通的 C 函数
  • 静态方法就像命名空间级别的函数(从调用的角度来看)
  • 非静态方法与静态方法非常相似,不同之处在于隐式 this 参数在其他参数之上传递(一个指针)

所有这 3 个都具有完全相同的性能。

另一方面,virtual 方法有一点开销。有一份关于性能的 C++ 技术报告估计了 empty 函数与非虚拟方法相比的开销在 10% 到 15%(来自内存)之间。这意味着对于任何内部有肉的功能(即,做真正的工作),开销本身接近于迷失在噪音中。真正的成本来自对内联的抑制,除非virtual 调用可以在编译时推导出来。

【讨论】:

  • @RiaD:我恐怕没看懂你这句话,15% of 0 vs non-0是什么意思?
【解决方案2】:

经典的旧 C 函数和类的静态方法完全没有区别。区别只是审美。如果你有多个 C 函数,它们之间有一定的关系,你可以:

  • 将它们分组到一个类中;
  • 将它们放入命名空间;

差异将再次体现在美学上。这很可能会提高可读性。

如果这些 C 函数共享一些静态数据,则将这些数据定义为类的私有静态数据成员是有意义的(如果可能)。在这种情况下,带有类的变体比带有命名空间的变体更可取。

我不鼓励您创建虚拟实例。这会误导源代码的读者。

为每个位图创建一个实例是可能的,甚至是有利的。特别是如果您在典型场景中多次调用此实例上的方法。

【讨论】:

    猜你喜欢
    • 2012-03-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 2013-11-04
    相关资源
    最近更新 更多