首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于软件(计算)效率和变量使用的编程原则

关于软件(计算)效率和变量使用的编程原则
EN

Software Engineering用户
提问于 2013-02-06 22:44:43
回答 4查看 403关注 0票数 8

我是受过古典训练的心理学家,而不是程序员,所以有时候编程的更高级的方面,尤其是关于程序效率和/或某些最佳实践,在这个例子中是关于变量的使用。

下面是一些伪代码:

代码语言:javascript
复制
var a;
var b;
var c;
function GetSomeInformation() {
    returns "XYZ";
}

a = GetSomeInformation();
b = GetSomeInformation();
c = GetSomeInformation();

所以我的问题是:

将数据存储到一个变量中,并引用与重复调用相同函数相反的数据,这或多或少是有效的(还是同样的)?

也就是说,这个代码效率更高吗?

代码语言:javascript
复制
var results = GetSomeInformation();
a = results;
b = results;
c = results;

如果是这样的话,效率上的得失是否在不同语言之间大致相同,还是因语言而异?相对于使用重复函数调用,是否有更好的命名变量的阈值,反之亦然?哪些方面可以改变它的效率(例如,它是类的成员函数还是全局范围中的常规函数)?等。

如果可能的话,我想知道这样一个概念是如何应用于C++/MFC对话框的,因为它是我在该框架中编写代码时出现的。

代码语言:javascript
复制
// define pointers to the items in my form
CListBox *pLISTBOX = (CListBox*) GetDlgItem(LISTBOX);
CStatic *pSTATIC_A = (CStatic*) GetDlgItem(STATIC_A);
CStatic *pSTATIC_B = (CStatic*) GetDlgItem(STATIC_B);
CEdit *pEDIT_BOX_A = (CEdit*) GetDlgItem(EDIT_BOX_A);
CEdit *pEDIT_BOX_B = (CEdit*) GetDlgItem(EDIT_BOX_B);
int SelectedIndex = pLISTBOX->GetCurSel();
pSTATIC_A->SetWindowText(pLISTBOX->GetItemData(SelectedIndex));
pSTATIC_B->SetWindowText(pLISTBOX->GetItemData(SelectedIndex));
pEDIT_BOX_A->SetWindowText(pLISTBOX->GetItemData(SelectedIndex));
pEDIT_BOX_B->SetWindowText(pLISTBOX->GetItemData(SelectedIndex));
EN

回答 4

Software Engineering用户

回答已采纳

发布于 2013-02-06 22:52:39

要回答您的问题:将数据存储在变量中并引用它通常更有效。额外的局部变量很便宜。

从一个简单的示例开始,假设您有代码片段:

代码语言:javascript
复制
x = 5;
y = x*x + 1;
z = x*x + 2;

如果您查看上面的代码,并假设您是一步一步执行它的CPU,CPU将用相同的x值执行两次乘法。这几乎总是比做一次乘法效率低:

代码语言:javascript
复制
x = 5;
x2 = x*x;
y = x2 + 1;
z = x2 + 2;

现在,现代编译器几乎总是有一个名为公共子表达式消除的优化,它将具有与上面示例相同的提取x2的效果。所以您通常不必担心它,因为编译器支持您。

尽管如此,使用诸如x2这样的变量可能会大大降低以下行的复杂性,因此,出于可读性的原因,引入这样的变量没有任何问题。

在MFC代码的情况下,您要重复调用pLISTBOX->GetItemData(SelectedIndex)。因为这是一个函数调用,对操作系统进行调用以获取进一步的数据,因此编译器无法对其执行常见的子表达式消除。相反,我将引入一个新变量,因此您只需要执行一次调用:

代码语言:javascript
复制
int SelectedIndex = pLISTBOX->GetCurSel();
const char *data = pLISTBOX->GetItemData(SelectedIndex);
pSTATIC_A->SetWindowText(data);
pSTATIC_B->SetWindowText(data);
pEDIT_BOX_A->SetWindowText(data);
pEDIT_BOX_B->SetWindowText(data);
票数 10
EN

Software Engineering用户

发布于 2013-02-06 22:55:00

  1. 是的,在大多数语言中,第二个代码的效率略高于第一个代码。
  2. 这可能不会产生任何实际影响。
  3. 它可能确实在可读性方面产生了影响,所以请使用更干净的代码。

此外,一个好的编译器(包括Java的JIT)将内联重复的方法调用和缓存重复使用的值,因此这两个示例可能最终执行得比较好。

参考以下经验法则:

让它起作用,使它正确,使它快速...按照这个顺序。 -肯特·贝克

第一条优化规则:不要。

第二条优化规则:不要..。目前还没有。

第三条优化规则:优化前的配置文件

过早优化是万恶之源。 - Donald Knuth

在大多数情况下,超过90%的程序时间将花费在<10%的代码中,如果不分析代码,您就不知道是哪10%。所以,在得到反馈之前,不要担心它;优化程序员的时间比运行时更有价值。

票数 3
EN

Software Engineering用户

发布于 2013-02-06 23:12:11

假设编译器还没有为您优化计算值,则将计算值存储在局部变量中通常更有效。实际上,有时这是在称为回忆录的技术中内置到函数本身中的。

然而,在大多数情况下,效率增益小到可以被认为是可以忽略不计的。在正确性之后,可读性通常应该是你最关心的问题。

话虽如此,使用局部变量也常常会使它更易读,这给了您最好的两个世界。使用您的例子:

代码语言:javascript
复制
const char* text = pLISTBOX->GetItemData(SelectedIndex);
pSTATIC_A->SetWindowText(text);
pSTATIC_B->SetWindowText(text);
pEDIT_BOX_A->SetWindowText(text);
pEDIT_BOX_B->SetWindowText(text);

对于人类读者来说,这一点更为清晰。您不仅不必在每一行上读取长函数调用,而且很明显,所有的小部件都接收着完全相同的文本。

票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/186169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档