【发布时间】:2016-09-17 16:06:18
【问题描述】:
解决我在大学的信息学作业,我总是找到不同的方法来解决同一个问题。 一种方法是最快的(执行时间)但最长且更复杂。 另一个是更容易实现,执行时间短,易于理解等等。
举个小例子,我们必须在 C++ 中创建一个程序,它输出一行 N 个元素,其中每个元素具有相同的相邻元素,但中间的元素不同。
Ex.
6 Elements: *_*_*_
7 Elements: *_*_*_*
第一个解决方案是最简单的:
#include <iostream>
using namespace std;
int main(void){
int a;
cin >> a;
for (int i=1; i<=a; i++)
{
if (i%2 != 0)
{
cout << "*";
}
else
{
cout << " ";
}
}
return 0;
}
第二个更难实现但执行速度更快(条件检查更少):
#include <iostream>
using namespace std;
int main(void){
int a;
cin >> a;
if (a%2 == 1)
{
for (int i=1; i<=a; i=i+2)
{
cout << "*";
cout << " ";
}
}
else
{
for (int i=1; i<a; i=i+2)
{
cout << "*";
cout << " ";
}
cout << " ";
}
return 0;
}
我的问题是我应该关注什么?干净的代码,易于实现/部署和更好的可读性或最佳算法,更快的执行和强大的逻辑,或者只是尽量混合所有这两种,因为这两种解决问题的方法之间总是存在差异?
【问题讨论】:
-
我会选择解决方案 2,只有一个 cout 以提高速度:)
for (int i=1; i<=a; i=i+2) { cout << "* "; }BTW 我相信示例 2 中有一个错字:两个循环都以相同的顺序发出星号和空格。 -
我看不出有任何理由让第二个版本有 2 个循环,为什么不把条件放在最后?
-
优化取决于项目。在消费产品中,目标是让软件完成 A.S.A.P.;所以获得一个工作版本是重中之重,速度是次要的。在时间很重要的事件关键型应用中,速度可能非常重要。没有万能的黄金法则。
-
for循环之间没有区别,所以去掉其中一个。更少的代码意味着更少的可能缺陷和更少的代码测试时间。 -
这个问题至少被问过好几次了。认为必须以清晰度换取性能是一种错误的二分法。另外,性能永远不是你想象的那样,所以你必须在程序的运行中找到它,而不是在写作中。 Here is a good way to do it.
标签: c++ algorithm performance optimization imperative-programming