为什么这段代码在Mac和Red Hat中的运行方式如此不同
Why this code run so differently in Mac and Red Hat
这是使用树列表累积数组的代码的一部分。它在红帽子里跑得很慢。
我循环这个代码,8860000次
mac消耗13.6957秒
红帽子消耗50.78秒。
为什么mac在cpu较慢的情况下运行相同的代码比Red hat快得多
我列出了这两个系统的信息,有人能帮我弄清楚吗
我用来编译的命令是:g++main.cc tp.cc-O2。
编译器确实有一些不同,mac air支持浮点计算比Red hat计算机更好吗,无论如何,请帮助我。
inline bool TP::left_branch(double const& fea_val, float const& node_val) {
return fea_val <= node_val;
}
void TP::predict(double const *features){
uint32_t i, n, k;
double* preds=predictions_;
memcpy(preds, init_preds_, sizeof(double) * class_count_);
for (i = 0; i < tree_count_; i++) {
struct Tree *tree = trees_ + i;
for (n = 0;;) {
struct Node *node = tree->root + n;
if (node->is_leaf) {
//leaf_nodes[i] = node->leaf_idx;
for (k = 0; k < class_count_; k++) {
preds[k] += node->increments[k];
}
break;
}
if (left_branch(features[node->var_idx], node->var_val)) {
n = n * 2 + 1;
} else {
n = n * 2 + 2;
}
}
}
}
Mac信息:
Mac:OS X Yosemite 10.10(14A389)
cpu:1.4 GHz Intel Core i5
编译器:配置有:--前缀=/Library/Developer/CommandLineTools/usr--带有gxx include dir=/usr/include/c++/4.2.1Apple LLVM 6.0版(clang-600.0.56)(基于LLVM 3.5svn)目标:x86_64-apple-darwin14.0.0线程型号:posix
Red Hat信息:
pc:Linux版本2.6.32-220.23.2.ali927.el5.x86_64
cpu:Intel(R)Xeon(R)cpu E5-2630 0@2.30GHz
编译:g++(GCC)4.1.2 20080704(Red Hat 4.1.2-51)
有很多可能的原因,我已经按可能性的降序列出了这些原因。
-
非常旧的编译器/OS版本:您正在一个同样过时的Linux发行版上运行一个非常旧的g++版本(超过7年)。很有可能您只是在处理代码质量的巨大差异。您应该考虑将您的Red Hat版本(或其他发行版)更新为更现代的版本,这不仅是因为性能,还因为安全问题。
-
内存分配器差异导致的位置性:另一个可能的原因是内存分配器(malloc)导致的位置差异。您可以在两个系统上尝试Hoard(www.Hoard.org)或另一个替代内存分配器来隔离这种影响。
-
硬件差异:您在两个完全不同的硬件平台上运行。虽然我不怀疑这是问题所在,但您可以通过在Mac上的虚拟机中运行Linux来隔离可能的硬件影响。使用Parallels或VMware之类的具有相当高性能的东西,而不是VirtualBox,后者没有。
- 不同/较旧的处理器运行c++代码的方式是否不同
- 如果第一个元素包含任何零,则我的程序以不希望的方式运行
- 我们如何并行运行算法的 n 个实例并以有效的方式计算结果函数的平均值?
- 以这种方式在运行时访问元组的性能成本
- 以编程方式在运行时检测 CPU 体系结构
- 如何在运行时以选择性方式排除代码块
- 在 Windows 命令行中运行.exe在使用 2 种相同方式执行时会产生不同的输出
- 如何检查过程是否在Red Hat Linux上运行
- 在计算机级别,应用程序以二进制方式运行,然后当发生运行时错误时,它如何呈现回错误代码
- 以有效的方式从 Node .js运行 C 或C++代码
- 如何以与Explorer中的管理员的启动相同的方式从CPP运行程序
- 为什么三元运算符在编译时的工作方式与运行时不同?
- C++ Qt - 检查 Steam 游戏是否以编程方式运行
- 在GCC 4.4.7 Red Hat 6.6上运行GCC 5.2
- 此应用程序已请求运行时以异常方式终止它 QT C++
- C ,以并行和协作的方式运行两个功能
- 为什么相同的代码在Visual Studio和Dev-C++中运行方式不同
- 为什么这段代码在Mac和Red Hat中的运行方式如此不同
- QML是在编译时被翻译成本机代码,还是在运行时被解释为JavaScript在web浏览器中的运行方式
- 与bash命令行相比,rsync与QProcess的运行方式不同