【发布时间】:2023-03-10 00:29:01
【问题描述】:
早在 70 年代 C 刚开始的时候,我猜编译器级别的优化并没有像现代编译器(clang、gcc 等)那样先进,而且计算机本身在硬件方面是有限的,这是普遍的偏好吗?源代码级别的可读性优化?
例子:
int arrayOfItems[30]; // Global variable
int GetItemAt(int index)
{
return globalArrayOfThings[index];
}
int main()
{
// Code
// ... arrayOfItems intialized somewhere
// More code
GetSomethingByItem(GetItemAt(4)); // Get at index 4
return 0;
}
现在可以优化为:
int arrayOfItems[30]; // Global variable
int main()
{
// Code
// ... arrayOfItems intialized somewhere
// More code
GetSomethingByItem(arrayOfItems[4]); // Get at index 4
return 0;
}
完全省略函数GetItemAt,从而通过直接从其地址访问值而不是进入函数、创建堆栈帧、访问值来节省时间并将结果推送到某个寄存器。人们过去更喜欢将第二个“优化”版本直接写入源代码还是使用第一个版本以便代码更具可读性?
我知道在这个例子中你可以使用处理器来“模仿”这种优化(例如#define GetItemAt(x) arrayOfItems[x]),但你明白我的意思。
另外,也许这个确切的优化功能从一开始就存在,如果是这样,我应该找到另一个例子,欢迎提出建议。
TL;DR -
- 过去是否普遍倾向于源代码级别的优化而不是可读性?
额外问题:
- 是否包含优化以使源代码更具可读性?
【问题讨论】:
-
不清楚你在问什么。如果它是“在某一时刻是否存在没有进行此优化的编译器?”,那么答案是“是的,可能。”。
-
@OliverCharlesworth 我编辑了我的问题,现在应该更清楚了。
-
您似乎在“可读性”的标题下混杂了很多东西,例如模块化、易于代码重用、可测试性、封装性、可维护性、可移植性等。总是在需要时进行优化,并且在知道需要时进行优化,否则人们只会坚持使用汇编。
-
在某些情况下,例如,独立的
x++;比++x;更受青睐(反之亦然),因为一个比另一个更快。为了提高性能,经常将数组索引转换为指针索引。上世纪 70 年代的 C 编程课很可能已经包含了几个小时来讨论这个主题。但请记住,除了没有优化编译器之外,那个时代的 CPU 比现代 CPU 慢了大约 1000 倍。 -
@Kevin - 那些忽视历史的人注定要重蹈覆辙。
标签: c optimization history