【问题标题】:Standard (simple?) benchmark code/test?标准(简单?)基准代码/测试?
【发布时间】:2018-06-06 04:21:57
【问题描述】:

是否有某种标准的基准测试系统或大纲之类的?我正在研究 go、llvm、d 和其他语言,我想知道它们在执行时间、内存使用等方面的公平性。

我找到了https://benchmarksgame-team.pages.debian.net/benchmarksgame/,但代码不一样。一个例子是 C++ 源代码小于 100 行,而 C 源代码大于 650。我很难说那是公平的。源代码中的另一个测试有一个愚蠢的错误,即把锁放在循环内,而其他语言把它放在外面。

所以我想知道一些我可能会考虑查看/运行的测试,它可能不使用非标准甚至复杂的库。就像完全在单个源文件中实现一样。公平的东西。

【问题讨论】:

标签: programming-languages benchmarking


【解决方案1】:

多年来,基准游戏网站在帮助页面上都展示了这一点 -

“不公平”是什么意思? (寓言)

他们跑来跑去,跑来跑去,跑来跑去,跑来跑去,跑来跑去。

猎豹的朋友们说“这不公平” - 每个人都知道猎豹是最快的生物,但比赛时间太长,猎豹会很累!

猎鹰的朋友们说“这不公平” - 每个人都知道猎鹰是最快的生物,但猎鹰的行走并不好,它会飞过天空!

马的朋友说“这不公平” - 每个人都知道马是最快的动物,但这只是一岁鸽,你必须停止比赛,直到一匹种马参加!

Man 的朋友说“这不公平” - 每个人都知道在“现实世界”中 Man 会骑摩托车,你必须等到 Man 加油并预热发动机!

蜗牛的朋友说“这不公平” - 每个人都知道一个生物应该留下史莱姆踪迹,所有其他生物都在作弊!

达尔马提亚的尾巴敲在地上。达尔马提亚喘着粗气说:“看那座美丽的山,让我们冲向山顶!”


当时“这不公平”的 cmets 大多是特殊的恳求,旨在为编程语言 X 争取优势,而不是编程语言 Y。

但是你的问题提出的问题有点不同。

  1. 首先看一下基准测试游戏中的n-body programs 网站。尽管节目 用不同的语言写成 差别很小 程序的编码方式。

    到目前为止,还没有人找到有效的 使用四核的方法 这个小的 n 体问题 - 所以那里 不是特殊的多核程序。 程序不使用非标准 或复杂的库。节目 完全在一个内部实现 单一源文件。

  2. 我说很少 n体的方式不同 程序已编码,但确实如此 真的意味着这些程序是 相同的?项目完成后不久 复活了,六七年前我 记得一个 Ada 程序员 半开玩笑地把苹果比作 橘子因为汇编语言 从 Ada 程序不是 与 C 中的汇编语言相同 程序 - 显然不是 被比较喜欢:-)

    • otoh Ada 源代码将具有 以不同的方式书写 比编写 C 源代码, 使 Ada 编译器产生 与 C 编译器相同的汇编语言 生产出来的。

    • otoh 如果汇编语言由 两个编译器确实是逐行的 一样,为什么会有 性能差异?

    当方式差异很小时 程序被编码然后乍一看 比较似乎是公平的,但强制 要编码的不同语言,如语言 X 可能偏爱语言 X。

  3. 正如 Yannick Versley 所说,重点是 使用不同的语言是为了 不同的方法 语言提供。换句话说, 有不止一种方法可以做到 同样的事情。

    mandelbrot programs on 基准游戏网站 - 最简单的 C 程序只有一半大小 最快的C程序;这 最简单的 C 程序是顺序的,并且 使用双打,最快的 C 程序 通过 OMP 和 GCC 使用所有 4 个内核 内在函数。

    • 其他语言采用不同的方法来使用所有 4 个内核 - 这是否意味着我们应该只比较顺序程序而忽略多核计算的现实?

    • 其他语言实现可能无法提供与 GCC 内在函数等效的功能 - 这是否意味着我们应该只比较使用双精度的程序?但是其他语言实现在它们表示双精度的方式上采用不同的方法 - 这是否意味着我们应该忽略所有浮点程序?

问题在于编程语言(和编程语言实现)与苹果对橘子的区别更大,但我们仍然要问 - 如果我用 X 语言编写程序会更快吗? - 和仍然希望得到一个比 - 这取决于您如何编写它!

基准游戏网站上的不同任务和不同程序表明,一些性能比较答案令人困惑和复杂——细节很重要。

【讨论】:

    【解决方案2】:

    基准测试并不完全是为了公平 - 它是关于在您的限制范围内为您自己的工作量选择一些东西。

    如果您想使用 alioth shootout 网站,如果您排除了过于冗长或过于缓慢的解决方案,您仍然可以获得有趣的信息(确切的平衡取决于您想要做什么 - 您是否编写了运行的代码? 5 秒,或占用十几台计算机五个月的时间)。查看一个特定问题的最简洁示例以了解一般问题结构 - 然后查看人们应用了哪些典型优化来使代码运行得更快。

    使用相同的代码进行基准测试没有抓住重点,因为您需要不同的东西来帮助使用不同的语言; Java 有 GC,这意味着它会在 trees 测试中表现出色,而您需要在 C/C++ 中自定义内存分配来与之竞争(并且特定的基准测试是结构化的,因此标准 malloc 确实很差),因为spectral-norm 一,你需要非装箱的双数组...

    如果您想提出自己的解决方案,请访问Project Euler - 有很多问题不依赖于复杂的库,但难以优化。否则,请尝试提出您认为足以过滤或排名枪战中(或之外)现有贡献的评分标准 - 例如,有一些问题的 ShedSkin 和 Cython 解决方案,这是“非官方的”,因为这些语言不包括在内)。

    【讨论】:

    • >>在 C/C++ 中自定义内存分配以与之竞争shootout.alioth.debian.org/u64q/…
    • >>该特定基准的结构使得标准 malloc 确实很差
    • 我将 glibc 的 obstacks、APR 池和 Boost 的对象池算作“自定义内存分配”,因为您必须了解对象的生命周期。因此,它们比 GC(仍然需要标记对象)或更快的 malloc(需要一个一个释放对象,即使 TCMalloc 可以避免 glibc malloc 所做的一些工作)更快
    • 对于 GC,我们通常会自定义调整 GC 参数,有时会明确何时应该进行 GC,以防止成本明显。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    相关资源
    最近更新 更多