我想优化看起来很重的c代码。
有人有想过优化下面的代码吗?
// r, g, b are variables
for (x from 0 to 255)
{
for (y from 0 to 255) {
// TODO: optimize here.
arr[x][y] = (r > g) ? (r > b ? (g > b ? r - b : r - g) : b - g) : (g > b ? (r > b ? g - b : g - r) : b - r);
}
答案 0 :(得分:1)
这种优化级别通常最好留给编译器本身,编译器本身通常比大多数语言用户更了解目标体系结构。
它会做的第一个事情(或可能做的事情,如果它没有)将移动计算在之外循环。
当然,这是假设代码具有代表性且r/g/b
在整个循环中保持不变,但是,我怀疑你的代码是简化的,它们实际上依赖于循环变量。
但是,你应该首先为可读性优化它,因为这种微优化很少能提供你想要的性能优势。进行宏优化任务通常要好得多,例如更有针对性的数据结构(时间交易空间)或更好的算法选择。
由于您的代码似乎获得了三个值的最大 spread (最高和最低之间的差异),因此可读性优化可能非常简单:
// No complex expressions or side effects allowed, you've been warned!
#define ordered(a,b,c) ((a >= b) && (b >= c))
if (ordered(r,g,b)) arr[x][y] = b - r;
else if (ordered(r,b,g)) arr[x][y] = g - r;
else if (ordered(b,r,g)) arr[x][y] = g - b;
else if (ordered(b,g,r)) arr[x][y] = r - b;
else if (ordered(g,r,b)) arr[x][y] = b - g;
else /* g,b,r */ arr[x][y] = r - g;
#undef ordered
远比你所拥有的三元怪物更具可读性: - )
并且,如果事实证明你做需要更多的咕噜声,你可以恢复到所说的代码,但是,为了爱你所信仰的任何神(如果有的话),请彻底评论它以解释什么它的意思是这样做,所以下一个维护你的代码的人会认为你是 1 。
如果您能确定改进是值得的,仅还原。优化的主要指示是"衡量,不要猜测"。
1 你应该总是假设跟随你的编码员是一个知道你住在哪里的精神病患者。在我的情况下,你是对的,我没有想法你居住的地方: - )
答案 1 :(得分:0)
另外,我建议测试这段代码是否真的很重或很麻烦。只是假设通常会导致错误的优化,因为使用的编译器可能会优化该问题。