23 考虑变更程序库

程序库的设计是一个折中的过程。理想的程序库应该短小、快速、强大、灵活、可扩展性、直观、试用、良好的支持、没有使用约束、没错误等等。真实的世界里。你不能拥有每一个优点,总的付出代价。

不同的设计给予这些条件赋予了不同的优先级。他们从而在设计中牺牲了不同的东西。因此一般两个提供相同功能的程序库却有着完全不同的特征。

例如,考虑iostream和stdio程序库。对于C++程序员来说两者都可以使用。iostream程序库与C中的stdio相比有几个优点。例如它是类型安全的,它是可扩展的。然而效率方面不如stdio。

让我们用一个简单的benchmark(基准)测试,只测试最基本的I/O功能。这个程序从标准输入读取30000个浮点数,然后把它们以规定的格式写入到标准输出里。编译时预处理符号STDIO决定使用stdio还是iostream:

#ifdef STDIO
#include <stdio.h>
#else
#include <iostream>
#include <iomanip>
using namespace std;
#endif

const int VALUES = 30000;

int main()
{
	double d;
	for(int n = 1; n <=VALUES; ++n)
	{
#ifdef STDIO
	scanf("%lf",&d);
	printf("%10.5f",d);
#else
	cin >> d;
	cout << setw(10)					//设置宽度
		 << setprecision(5)				//设置小数位置
		 << setiosflags(ios::showpoint)	//强制显示小数点
		 << setiosflags(ios::fixed)		//固定的浮点显示
		 << d;
#endif
	if(n%5 == 0)
#ifdef STDIO
	printf(‘'\n'’);
#else
	cout << '\n';
#endif

	}
	return 0;
}	

上述使用C++的输出远不如C的方便,但是操作符<<即使类型安全又可以扩展,而printf不具备这样的有点。

总结:

iostream和stdio之间性能的对比不过是一个例子,这并不重要,重要的是具有相同功能的不同的程序库在性能上采取不同的权衡措施,所以一旦找到程序的瓶颈,你应该知道是否可以通过替换程序库来消除瓶颈。比如如果你的程序的有I/O瓶颈,你考虑用stdio替换iostream,如果程序的在动态分配和释放上存在使用大量的时间,你可以想想是否有其他的operator new和operator delete的实现可用。因为不同的程序库在效率、可扩展性、移植性、类型安全和其他一些重要领域上蕴含着不用的设计理念,通过变更使用给予性能的更多考虑的程序库,你有时可以大幅度提高软件的效率。

猜你喜欢

转载自blog.csdn.net/weixin_28712713/article/details/81353198
23