哪个更有效?还是两者都同样有效? 星号标记的底层体系结构中发生了什么?
(1)
for(int i = m_size; i > index; --i)
{
int k = normalize(i); ***
m_data[k] = m_data[k - 1];
}
或(2)
int k = 0; ***
for(int i = m_size; i > index; --i)
{
k = normalize(i); ***
m_data[k] = m_data[k - 1];
}
答案 0 :(得分:4)
代码段1对于天真的编译器效率更高,因为第二个代码段要求在变量k中加载0。
一个好的编译器会认识到在for循环中加载k之前没有使用k,并将优化多余的赋值。
您可以使用代码段2而不加载0:private Comparator<BookItem> compareBooks = (o1, o2) -> {
if (o1.sort_order == BookItem.ORDER && o2.sort_order != BookItem.ORDER) {
return -1;
} else if (o1.start_date != BookItem.START && o2.start_date == BookItem.START) {
return 1;
} else if (o1.ID == BookItem.ID && o2.ID == BookItem.ID) {
return 0
}
};
答案 1 :(得分:2)
如果不知道您在说什么架构,很难说出“底层架构中正在发生什么”。但是总的来说,任何“哪种效率更高”的问题都只能通过以下明显的方式来回答:通过测量哪种版本最终在您的特定应用中效率更高……
请注意,任何对远程有用的编译器都应将您的两个示例都转换为完全相同的机器代码…
答案 2 :(得分:2)
不要为这种微级优化而烦恼。让编译器/优化器为您完成它。按照C ++风格,第二种方法更好,因为它声明的变量接近用法(如“代码完成”书中所述)。除了C风格外,如果要在循环后使用变量,第一种方法是好的。
请注意,函数normalize
,类型m_data
,所涉及的运算符[]
等均在优化中发挥作用。数据大小,并行度,处理器体系结构在程序的运行时性能中也起着重要作用。
答案 3 :(得分:1)
这不是效率问题。第一种方法更好,因为它使用RAII(初始化资源分配)方法。第二个是更多的C风格。使用时应声明变量,而不是在功能块的开头。参见以下示例:
void f1(bool use)
{
ComplexObject c; // creating an object that has very costly, time-and-memory-consuming initialization
if (! use)
return;
c.someFunction();
}
明白我的意思吗?