不要轻易相信按用按位运算符的速度高很多!

wuxk 2003-07-03 03:29:08
今天做了一个测试,主要是交换两个变量的数值。
一个使用按位异或运算完成,另一个使用了一个临时变量,进行了n多次循环的交换,发现了用位运算符进行交换的性能远远不如用临时变量进行交换的。而且,程序的可读性几乎没有。
所以,我觉得在能不用位运算的时候,尽量不使用位运算为佳,尽管可能某些情况下会快一些,但增加了维护的时候的困难,而性能并不见得到了提高。
测试代码如下:
public class FirstDebug {

/*
* Construct for FirstDebug
*/
public FirstDebug(){

}
public static void main(String[] args){
long a=1;
long b=1;
long timeCount;
Calendar endC;
Calendar startC;

System.out.println("交换以下两数:");
System.out.println("a=" + a);
System.out.println("b=" + b);

System.out.println("第一批交换开始!");
startC = new GregorianCalendar();
for(long i=0;i<99999999;i++){
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
endC = new GregorianCalendar();
timeCount = endC.getTimeInMillis() - startC.getTimeInMillis();
System.out.println("第二批交换运行完成,所花时间(毫秒):" + timeCount);

startC = new GregorianCalendar();
System.out.println("第二批交换开始!");
long c=0;
for(long i=0;i<99999999;i++){
c=a;
a=b;
b=c;
}
endC = new GregorianCalendar();
timeCount = endC.getTimeInMillis() -startC.getTimeInMillis();
System.out.println("第二批交换运行完成,所花时间(毫秒):" + timeCount);
}
}

运行结果如下:

交换以下两数:
a=1
b=1
第一批交换开始!
第二批交换运行完成,所花时间(毫秒):1500
第二批交换开始!
第二批交换运行完成,所花时间(毫秒):1375
...全文
284 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuxk 2003-07-03
  • 打赏
  • 举报
回复

对,可能和平台有关系,据说在windows下编译出来的代码在LINUX上运行就比在Linux下编译的代码要快一点,这也是别人测试的。
在各种平台下的表现不一致,我觉得这可能算是Java不够成熟的体现吧。

我的机器是p4 1.7G,512M内存的,效率比你的可就低多了呵呵,看样子瓶颈在CPU上了。

不过两种算法这么微小的差别,使用异或进行交换可能只在内存容量比较小的机器上使用比较适合吧。否则考虑到程序的可读性等等,还是用临时变量交换要好一些吧。
xiaohaiz 2003-07-03
  • 打赏
  • 举报
回复
可能在各个平台上表现不一样,不过按照你的程序的算法理论上应该临时变量快.
为了分析这点,我改造了你的算法成为两个类C1和C2.
C1使用位运算进行交换,C2使用临时变量进行交换.
源码如下:
public class C1 {
public static void main(String[] args) {
long a = 1;
long b = 1;
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
}
public class C2 {
public static void main(String[] args) {
long a = 1;
long b = 1;
long c = 0;
c = a;
a = b;
b = c;
}
}
编译成为class之后使用javap -c 反编译得到结果:
C1:
==============================
Method void main(java.lang.String[])
0 lconst_1
1 lstore_1
2 lconst_1
3 lstore_3 // 以上是a与b的赋值

4 lload_1 // 取出a的值
5 lload_3 // 取出b的值
6 lxor // 异或
7 lstore_1 // 存回a. 以上执行 a = a ^ b

8 lload_1 // 取出a的值
9 lload_3 // 取出b的值
10 lxor // 异或
11 lstore_3 // 存回b. 以上执行 b=a^b

12 lload_1 // 取a
13 lload_3 // 取b
14 lxor // 异或
15 lstore_1 // 存回a. 以上执行a=a^b

16 return

C2:
==============================
Method void main(java.lang.String[])
0 lconst_1
1 lstore_1
2 lconst_1
3 lstore_3 // a, b初始化

4 lconst_0
5 lstore 5 // c,初始化

7 lload_1 // 取a
8 lstore 5 // 存c

10 lload_3 // 取b
11 lstore_1 // 存a

12 lload 5 // 取c
14 lstore_3 // 存b

15 return

C1每一个循环需要12条指令, 而C2每一个循环只需要6条指令.
所以我觉得C2的效率会更高.

但是在我的机器上执行的结果确实是C1<C2. 无法解释,是否与平台相关?
xiaohaiz 2003-07-03
  • 打赏
  • 举报
回复
不要只在一个平台下实验就得出结论,先给你看看我在
P4 2.0G 256M Redhat Linux 9.0 下 jdk1.4.1_02 运行的结果:

第一次运行:
=====================================================
a=1
b=1
第一批交换开始!
第二批交换运行完成,所花时间(毫秒):1060
第二批交换开始!
第二批交换运行完成,所花时间(毫秒):1073

第二次运行:
=====================================================
交换以下两数:
a=1
b=1
第一批交换开始!
第二批交换运行完成,所花时间(毫秒):1101
第二批交换开始!
第二批交换运行完成,所花时间(毫秒):1170

第三次运行:
=====================================================
交换以下两数:
a=1
b=1
第一批交换开始!
第二批交换运行完成,所花时间(毫秒):1058
第二批交换开始!
第二批交换运行完成,所花时间(毫秒):1167

如果只是从你的测试来看,并不能够下此结论.
wuxk 2003-07-03
  • 打赏
  • 举报
回复
将倒数第三行的"第二批"改为"第一批"呵呵。
1 开题报告 计算机科学与技术 基于 JAVA 的俄罗斯方块游戏设计与实现 一、 综述本课题国内外研究动态,说明选题的依据和意义 本课题国内外动态: 学校现已开设的课程有 C 语言、VB、C++,自己本身自学了 Java,就目前了解,可用 Jave,VB 和 C++编写俄罗斯方块程序。 (1)VB 的优点 VB 是完全中文化的环境使用,语句生成器和快速提示帮助使用户不必记忆成千上万的属性和 方法,在较短的时间内就能开发出功能强大的应用程序。Internet 应用程序的开发功能更加强大 和容易,支持动态 HTML 技术的应用程序。应用程序安装向导能帮助用户自动生成具有一定功能的 应用程序,加快了程序的开发速度。 (2)C++的优点 C++是对 C 语言的扩充,扩充的绝大部分来自著名语言中的最佳特性:从 SIMULA 67 中吸取了 类,从 ALGOL 68 中吸取了运算符一名多用、引用和在分程序中任何地方说明变量,综合了 Ada 的 类属和 Clu 的模块特点,从 BCPL 中吸取异常处理,从 BCPL 中吸取了用//表示注释。 (3)Java 的优点 Java 是定义位于网络计算的计算机语言,它几乎所有的特点也是围绕着这一中心展开的并为 之服务的,这些特点使得 Java 语言特别适全于用来开发网络上的应用程序;另外,作为一种面世 较晚的语言,Java 也集中体现和充分利用了当代软件技术新成果,如面向对象、多线程等,这些 也都在它的特点中有所反映。 1.开台无关性 如前所述,Java 语言独特的运行机制使得它具有良好的二进制级的可移植性,利用 Java,开 发人员可以编写出与具体平台无关、普遍适用的应用程序,大大降低了开发、维护和管理的开销。 2.面向对象 Java 是面向对象的编程语言。面向对象技术较好地适应了当今软件开发过程中新出现的种种 传统面向过程语言所不能处理的问题,包括软件开发的规模扩大、升级加快、维护量增大经及开发 分工日趋细化、专业化和标准化等,是一种迅速成熟、推广的软件开发方法。面向对象技术的核心 2 是以更接近人类思维的方式建立计算机逻辑模型,它利用类和对象的机制将数据与其上的操作封装 在一起,并通过统一的接口与外界交互,使反映现实世界实体的各个类在程序中能够独立、自治、 继承;这种方法非常有利于提程序的可维护性和可重用性,大大提了开发效率和程序的可管理 性,使得面向过程语言难于操纵的大规模软件可以很方便的创建、使用和维护。 3.安全稳定 对网络上应用程序的另一个需求是较的安全可靠性。用户通过网络获取并在本地运行的应用 程序必须是可依赖的,不会充当病毒或其他恶意操作的传播者而攻击用户本地的资源;同时它还应 该是稳定的,轻易不会产生死机等错误,使得用户乐于使用。 4.支持多线程 多线程是当今软件技术的又一重要成果,已成功应用在操作系统、应用开发等多个领域。多程 序技术允许同一个程序有两个执行线索,即同时做两件事情,满足了一些复杂软件的需求。Java 不但内置多线程功能,而且提供语言级的多线程支持,即定义了一些用于建立、管理多线程的类和 方法,使得开发具有多线程功能的程序变得简单、容易和有效。 5.简单易学 如前所述,衍生自 C++的 Java 语言,出于安全稳定性的考虑,去除了 C++中不容不得易理解和 掌握的部分,如最典型的指针操作等,降低了学习的难度;同时 Java 还有一个特点就是它的基本 语法部分与 C 语言几乎一模一样。这样,无论是学过 Java 再学 C,还是已经掌握了 C 语言再业学 Java,都会感到易于入门。 选题的依据和意义: 俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济 价值可以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人 Alex Pajitnov 制作的, 它看似简单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄 罗斯方块时代。究其历史,俄罗斯方块最早还是出现在 PC 机上,而中国的用户都是通过红白机了 解、喜欢上它的。现在远航游戏中心又将重新掀起这股让人沉迷的俄罗斯方块风潮。对一般用户来 说,它的规则简单,容易上手,且游戏过程变化无穷,而在 "远航游戏中心俄罗斯方块"中,更 有一些远航游戏中心网络游戏所独有的魅力――有单机作战与两人在线对战两种模式,用户可任选 一种进行游戏。网络模式还增加了积分制,使用户既能感受到游戏中的乐趣,也给用户提供了一个 展现自己超技艺的场所。有研究者发现玩俄罗斯方块游戏有助于防止创伤后应激障碍的发生,可 能是这个游戏能够对大脑储存视觉记忆的功能产生干扰,从而保护病人免受创伤后应激反应的影 3 响 。在了解自己对各个语言编程能力了解后,经过再三比较了三种语言后,决定采用
毕业设计开题报告 计算机科学与技术 基于JAVA的俄罗斯方块游戏设计与实现 1. 综述本课题国内外研究动态,说明选题的依据和意义 本课题国内外动态: 学校现已开设的课程有C语言、VB、C++,自己本身自学了Java,就目前了解,可用J ave,VB和C++编写俄罗斯方块程序。 (1)VB的优点 VB是完全中文化的环境使用,语句生成器和快速提示帮助使用户不必记忆成千上万的 属性和方法,在较短的时间内就能开发出功能强大的应用程序。Internet应用程序的开 发功能更加强大和容易,支持动态HTML技术的应用程序。应用程序安装向导能帮助用户 自动生成具有一定功能的应用程序,加快了程序的开发速度。 (2)C++的优点 C++是对C语言的扩充,扩充的绝大部分来自著名语言中的最佳特性:从SIMULA 67中吸取了类,从ALGOL 68中吸取了运算符一名多用、引用和在分程序中任何地方说明变量,综合了Ada的类属和 Clu的模块特点,从BCPL中吸取异常处理,从BCPL中吸取了用//表示注释。 (3)Java的优点 Java是定义位于网络计算的计算机语言,它几乎所有的特点也是围绕着这一中心展开 的并为之服务的,这些特点使得Java语言特别适全于用来开发网络上的应用程序;另外 ,作为一种面世较晚的语言,Java也集中体现和充分利用了当代软件技术新成果,如面 向对象、多线程等,这些也都在它的特点中有所反映。 1.开台无关性 如前所述,Java语言独特的运行机制使得它具有良好的二进制级的可移植性,利用J ava,开发人员可以编写出与具体平台无关、普遍适用的应用程序,大大降低了开发、维 护和管理的开销。 2.面向对象 Java是面向对象的编程语言。面向对象技术较好地适应了当今软件开发过程中新出现 的种种传统面向过程语言所不能处理的问题,包括软件开发的规模扩大、升级加快、维 护量增大经及开发分工日趋细化、专业化和标准化等,是一种迅速成熟、推广的软件开 发方法。面向对象技术的核心是以更接近人类思维的方式建立计算机逻辑模型,它利用 类和对象的机制将数据与其上的操作封装在一起,并通过统一的接口与外界交互,使反 映现实世界实体的各个类在程序中能够独立、自治、继承;这种方法非常有利于提程 序的可维护性和可重用性,大大提了开发效率和程序的可管理性,使得面向过程语言 难于操纵的大规模软件可以很方便的创建、使用和维护。 3.安全稳定 对网络上应用程序的另一个需求是较的安全可靠性。用户通过网络获取并在本地运 行的应用程序必须是可依赖的,不会充当病毒或其他恶意操作的传播者而攻击用户本地 的资源;同时它还应该是稳定的,轻易不会产生死机等错误,使得用户乐于使用。 4.支持多线程 多线程是当今软件技术的又一重要成果,已成功应用在操作系统、应用开发等多个领 域。多程序技术允许同一个程序有两个执行线索,即同时做两件事情,满足了一些复杂 软件的需求。Java不但内置多线程功能,而且提供语言级的多线程支持,即定义了一些 用于建立、管理多线程的类和方法,使得开发具有多线程功能的程序变得简单、容易和 有效。 5.简单易学 如前所述,衍生自C++的Java语言,出于安全稳定性的考虑,去除了C++中不容不得易 理解和掌握的部分,如最典型的指针操作等,降低了学习的难度;同时 Java还有一个特 点就是它的基本语法部分与C语言几乎一模一样。这样,无论是学过Java再学C,还是已 经掌握了C语言再业学Java,都会感到易于入门。 选题的依据和意义: 俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造 成的经济价值可以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人 Alex Pajitnov 制作的,它看似简单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶 不思饭不想的那个俄罗斯方块时代。究其历史,俄罗斯方块最早还是出现在 PC 机上,而中国的用户都是通过红白机了解、喜欢上它的。现在远航游戏中心又将重新掀 起这股让人沉迷的俄罗斯方块风潮。对一般用户来说,它的规则简单,容易上手,且游 戏过程变化无穷,而在 "远航游戏中心俄罗斯方块"中,更有一些远航游戏中心网络游戏所独有的魅力――有单机 作战与两人在线对战两种模式,用户可任选一种进行游戏。网络模式还增加了积分制, 使用户既能感受到游戏中的乐趣,也给用户提供了一个展现自己超技艺的场所。有研 究者发现玩俄罗斯方块游戏有助于防止创伤后应激障碍的发生,可能是这个游戏能够对 大脑储存视觉记忆的功能产生干扰,从而保护病人免受创伤后应激反应的影响 。在了解自己对各个语言编程能力了解后,经过再三比较了三种语言后,决定采用Java 语言编写俄罗斯方块。 二、研究的基本内容,拟解决的主要问题: 研究的基本内容: 1.学习

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧