四、程序结果的分析与比较 以下从灵活性、易用性和效率三方面对
JAVA中的对象和使用Agent以后的C++对象的使用情况进行分析和比较。
1、灵活性
由于Agent类直接包含了C++的对象指针Marrow,所以任何C++的指针操作均可应用于Agent类上。从它派生出来的任何子类都可以对这一受保护的对象指针实施所需要的操作,使得用户获得了最大限度的灵活性。但就Agent本身而言,并不允许外部程序访问Marrow,故不存在很多人担心的指针误用的问题,因而是
安全的。此外,这样做把对象的管理和使用分开来。就是说,譬如有对象Agent<ObjectClass> Instance,则Instance.Method ()指调用对象中属于Agent类的对所有对象类型均适用的方法(如存储管理、对象数据维护等功能,用户可以在Agent的派生类中自行添加),而Instance().Method()则调用属于ObjectClass本身用于实施具体操作的成员(对于绘图类的绘图操作、
打印类的打印操作等等)。通过这种方法,有需要的程序员可以参与系统内部的对象管理机制,而一般的编程者则可以避免误用指针的烦恼。这种C++特有的灵活性和适应性是JAVA所不能具备的。
2、易用性
使用Agent类与JAVA的主要区别仅在于上文列举的两处形式上的不同点。对Agent不作任何继承和更改的情况下,程序员可以像正在使用JAVA那样,不须关心内存分配和清理,不须深入了解指针的概念,依照JAVA的步骤来使用对象。所以二者在此方面相当。
3、运行效率
这是大多数程序员最关心的。下面有两组测试数据,分别是上述例子C++程序(使用Microsoft Visual C++ 6.0编译运行)与JAVA程序(分别运行于IBM VisualAge for JAVA 3.0和Borland J Builder 3.0下)在两台不同型号的计算机上的运行结果,使用的
操作系统为 Microsoft Windows 98,且保证测试过程中没有出现影响结果准确性的明显读磁盘现象。从表中的数据可以很清楚地看到,使用Agent类之后,C++的程序仍然比JAVA程序快很多。这是由于编译型语言对于解释型语言在速度上具有一贯的优势;另外, C++程序并不需要创建一个独立的线程来管理资源,因此其运行开销比JAVA更小。
表3
| 计算机配置 |
VisualAge for JAVA 3.0 |
JBuilder 3.0 |
使用Agent后Visual C++ 6.0 |
| 最小运行时间(ms) |
最大运行时间(ms) |
平均运行时间(ms) |
总共运行时间(ms) |
最小运行时间(ms) |
最大运行时间(ms) |
平均运行时间(ms) |
总共运行时间(ms) |
最小运行时间(ms) |
最大运行时间(ms) |
平均运行时间(ms) |
总共运行时间(ms) |
Duron 700 128M RAM |
1335 |
2008 |
1512 |
15122 |
220 |
270 |
225 |
2250 |
110 |
170 |
143 |
1430 |
Celeron 333 64M RAM |
2504 |
4988 |
3778 |
37784 |
440 |
550 |
466 |
4660 |
160 |
280 |
258 |
2580 |
从这三方面比较可以看出,在对象使用上,JAVA的表现并不如预期的理想,而C++亦并不如JAVA广告中所指出的那么差强人意。JAVA摒弃指针使用的根本原因就在于JAVA必须实现其跨平台使用的优点。虽然,JAVA的任何缺点都不能掩盖这个优点,然而,为了实现这个其他众多语言都不可能达到的优点,它作出了巨大的牺牲:如果
网络计算机上任一块内存都可以被远程程序访问的话,网络的安全性和稳定性就无法保障。放弃指针和代理内存的分配和回收等等措施的产生,很大程度上是由于把这些操作留给用户实在不适应网络编程的要求。出于类似的考虑,除了内存资源以外,JAVA解释器也为用户代管了大多数的计算机资源。因此,与其说这些是
设计者们精心改良的成果,不如说是设计者们为了适应网络特性而采取的折中。而这种折中正是JAVA作为一门新兴网络语言得以生存的关键因素。
五、结论 JAVA虽然流行,但并不代表它任何创新的方面都是值得吹嘘的;C++成形虽然已经十年,但是它的优越性并未被
软件业发展的潮流所冲垮,C++程序员不必对之失去信心:任何问题都应该全面地、辩证地看待。
