- 浏览: 538487 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
飞天奔月:
public List<String> gener ...
实践中的重构30_不做油漆匠 -
在世界的中心呼喚愛:
在世界的中心呼喚愛 写道public class A {
...
深入理解ReferenceQueue GC finalize Reference -
在世界的中心呼喚愛:
在世界的中心呼喚愛 写道在世界的中心呼喚愛 写道在classB ...
深入理解ReferenceQueue GC finalize Reference -
在世界的中心呼喚愛:
在世界的中心呼喚愛 写道在classB的finalize上打断 ...
深入理解ReferenceQueue GC finalize Reference -
在世界的中心呼喚愛:
iteye比较少上,如果可以的话,可以发e-mail交流:ch ...
深入理解ReferenceQueue GC finalize Reference
鲁迅先生的名文孔乙己中,孔乙己纠结于茴香豆的茴字有多种写法,可惜小孩子不愿意学,可惜了孔乙己的一片良苦用心。
一个功能,不同的程序员的实现,基于各种因素,可能是千差万别的。即使是同一个程序员,一般也会有多种方式来完成该程序的编写。面对各种不同的可能实现方式,挑选出适合当前场景的实现,就变成了程序员责无旁贷的任务。
性能结果报告:
100000次执行的性能结果。
单位ms。
str2HexString_0 132016
str2HexString_1 8906
str2HexString_2 5297
str2HexString_3 7859
str2HexString_4 4203
str2HexString_5 3985
你的改法和我的方法3没有本质区别,但是性能结果不理想。
这个过程也许有一点点过。但是反重构我是不同意的。
软件本身就不是一个简单的事情。看到<<或者>>如果你觉得不舒服我只能说个人的理解不一样。
这个类一看就知道应该是底层协议用的,当然是比较底层的。
1)"0123456789ABCDEF".charAt(left)
2)char[] chs={'0','1'........'F'}
charAt源码:
public char charAt(int index) {
if ((index < 0) || (index >= count)) {
throw new StringIndexOutOfBoundsException(index);
}
return value[index + offset];
}
这两行代码的效率是不一样的。因为1)的代码比2)的代码多了一个方法调用、参数传递还有里边判断的过程。
这个的底层协议,导致数据长度比原来增加了一倍,这个方案本身就是粗糙的,然后拼命的提高代码效率...
个人喜好吧
你的改法和我的方法3没有本质区别,但是性能结果不理想。
这个过程也许有一点点过。但是反重构我是不同意的。
软件本身就不是一个简单的事情。看到<<或者>>如果你觉得不舒服我只能说个人的理解不一样。
这个类一看就知道应该是底层协议用的,当然是比较底层的。
一个功能,不同的程序员的实现,基于各种因素,可能是千差万别的。即使是同一个程序员,一般也会有多种方式来完成该程序的编写。面对各种不同的可能实现方式,挑选出适合当前场景的实现,就变成了程序员责无旁贷的任务。
/** * 这个是最早的程序版本,把一个字符串转换成一个16进制编码的字符串。 * 看到这段代码的时候,第一反应是怎么不用StringBuilder。而是字符串相加。 * 其次,这个是一个常用的工具类,每天的调用量很大,性能看上去不怎么好。 * */ public static String str2HexString_0(String str) { String ret = ""; byte[] b = str.getBytes(); for (int i = 0; i < b.length; i++) { String hex = Integer.toHexString(b[i] & 0xFF); if (hex.length() == 1) { hex = '0' + hex; } ret += hex.toUpperCase(); } return ret; } /** * 第一次尝试修改。核心思想是用StringBuilder代替String。展开数字对String的转换,避免调用toUpperCase方法。 * */ public static String str2HexString_1(String str) { StringBuilder sb = new StringBuilder(str.length() << 1); byte[] data = str.getBytes(); for (int i = 0; i < data.length; i++) { int left = (data[i] & 0xF0) >> 4; append(sb, left); int right = data[i] & 0x0F; append(sb, right); } return sb.toString(); } private static void append(StringBuilder sb, int i) { switch (i) { case 0: sb.append("0"); break; case 1: sb.append("1"); break; case 2: sb.append("2"); break; case 3: sb.append("3"); break; case 4: sb.append("4"); break; case 5: sb.append("5"); break; case 6: sb.append("6"); break; case 7: sb.append("7"); break; case 8: sb.append("8"); break; case 9: sb.append("9"); break; case 10: sb.append("A"); break; case 11: sb.append("B"); break; case 12: sb.append("C"); break; case 13: sb.append("D"); break; case 14: sb.append("E"); break; case 15: sb.append("F"); break; default: break; } } /** * 测试发现,第一次的修改速度提高了。但是code变长了,看起来不是很舒服。 想了想不用switch是可以提高code的简洁程度的。 * 于是有了第2次修改。 * */ public static String str2HexString_2(String str) { StringBuilder sb = new StringBuilder(str.length() << 1); byte[] data = str.getBytes(); for (int i = 0; i < data.length; i++) { int left = (data[i] & 0xF0) >> 4; sb.append("0123456789ABCDEF".charAt(left)); int right = data[i] & 0x0F; sb.append("0123456789ABCDEF".charAt(right)); } return sb.toString(); } /** 想了想用数组不用charAt会不会更快呢。于是有了下面的版本。 */ public static String str2HexString_3(String str) { StringBuilder sb = new StringBuilder(str.length() << 1); byte[] data = str.getBytes(); for (int i = 0; i < data.length; i++) { int left = (data[i] & 0xF0) >> 4; sb.append(digit2string[left]); int right = data[i] & 0x0F; sb.append(digit2string[right]); } return sb.toString(); } private static final String[] digit2string = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", }; /** * 测试发现第3次修改的性能不怎么样。而且code不易读了。算是一个失败的修改。 * 出去抽了一根烟,突然醒悟到为什么一定要用StringBuilder呢, * 这个程序实质上就是一个对数据的操作。既然是对数据的操作,那就直接操作数据好了。干嘛要多绕一圈呢。 于是有了下面的版本。 * */ public static String str2HexString_4(String str) { byte[] oldData = str.getBytes(); char[] tmpData = new char[oldData.length << 1]; for (int i = 0; i < oldData.length; i++) { int left = (oldData[i] & 0xF0) >> 4; tmpData[i << 1] = "0123456789ABCDEF".charAt(left); int right = oldData[i] & 0x0F; tmpData[(i << 1) + 1] = "0123456789ABCDEF".charAt(right); } return new String(tmpData); } /** 网友gdpglc的思路.*/ public static String str2HexString_5(String str) { byte[] oldData = str.getBytes(); char[] tmpData = new char[oldData.length << 1]; for (int i = 0; i < oldData.length; i++) { int left = (oldData[i] & 0xF0) >> 4; tmpData[i << 1] = digit2char[left]; int right = oldData[i] & 0x0F; tmpData[(i << 1) + 1] = digit2char[right]; } return new String(tmpData); } private static final char[] digit2char = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', }; /** * 返回一个随机的字符串。150是基于该程序使用场景的抽样得到的长度。 * */ private static String getRandomString() { StringBuilder sb = new StringBuilder(); Random r = new Random(); int length = 150 + r.nextInt(50); for (int i = 0; i < length; i++) { sb.append('a' + r.nextInt(26)); } return sb.toString(); } /** * 随机单元测试。 结果见perfResult.txt。 * * */ @Test public void test() { for (int i = 0; i < 100; i++) { String inputString = getRandomString(); String result_0 = str2HexString_0(inputString); String result_1 = str2HexString_1(inputString); String result_2 = str2HexString_2(inputString); String result_3 = str2HexString_3(inputString); String result_4 = str2HexString_4(inputString); String result_5 = str2HexString_5(inputString); Assert.assertEquals(result_0, result_1); Assert.assertEquals(result_1, result_2); Assert.assertEquals(result_2, result_3); Assert.assertEquals(result_3, result_4); Assert.assertEquals(result_4, result_5); Assert.assertEquals(result_5, result_0); } }
性能结果报告:
100000次执行的性能结果。
单位ms。
str2HexString_0 132016
str2HexString_1 8906
str2HexString_2 5297
str2HexString_3 7859
str2HexString_4 4203
str2HexString_5 3985
评论
7 楼
gdpglc
2010-12-17
zhang_xzhi_xjtu 写道
gdpglc 写道
"0123456789ABCDEF".charAt(left)
地方还可以优化
char[] chs={'0','1'........'F'}
chs[left]
不过我一定不会这么用。我宁可用Character.forDigit方法,这样的代码可读性太差了。这么在乎性能的理由是什么?你在写系统软件吗?
把乘2写成<<1,唉。我觉得真是精力过剩了..........
这哪能叫重构.... 整个一个反重构
地方还可以优化
char[] chs={'0','1'........'F'}
chs[left]
不过我一定不会这么用。我宁可用Character.forDigit方法,这样的代码可读性太差了。这么在乎性能的理由是什么?你在写系统软件吗?
把乘2写成<<1,唉。我觉得真是精力过剩了..........
这哪能叫重构.... 整个一个反重构
你的改法和我的方法3没有本质区别,但是性能结果不理想。
这个过程也许有一点点过。但是反重构我是不同意的。
软件本身就不是一个简单的事情。看到<<或者>>如果你觉得不舒服我只能说个人的理解不一样。
这个类一看就知道应该是底层协议用的,当然是比较底层的。
1)"0123456789ABCDEF".charAt(left)
2)char[] chs={'0','1'........'F'}
charAt源码:
public char charAt(int index) {
if ((index < 0) || (index >= count)) {
throw new StringIndexOutOfBoundsException(index);
}
return value[index + offset];
}
这两行代码的效率是不一样的。因为1)的代码比2)的代码多了一个方法调用、参数传递还有里边判断的过程。
这个的底层协议,导致数据长度比原来增加了一倍,这个方案本身就是粗糙的,然后拼命的提高代码效率...
个人喜好吧
6 楼
pop1030123
2010-12-17
这个类还有什么用处?还可以用来在字符编码间转码吧?
5 楼
zhang_xzhi_xjtu
2010-12-17
gdpglc 写道
"0123456789ABCDEF".charAt(left)
地方还可以优化
char[] chs={'0','1'........'F'}
chs[left]
不过我一定不会这么用。我宁可用Character.forDigit方法,这样的代码可读性太差了。这么在乎性能的理由是什么?你在写系统软件吗?
把乘2写成<<1,唉。我觉得真是精力过剩了..........
这哪能叫重构.... 整个一个反重构
地方还可以优化
char[] chs={'0','1'........'F'}
chs[left]
不过我一定不会这么用。我宁可用Character.forDigit方法,这样的代码可读性太差了。这么在乎性能的理由是什么?你在写系统软件吗?
把乘2写成<<1,唉。我觉得真是精力过剩了..........
这哪能叫重构.... 整个一个反重构
你的改法和我的方法3没有本质区别,但是性能结果不理想。
这个过程也许有一点点过。但是反重构我是不同意的。
软件本身就不是一个简单的事情。看到<<或者>>如果你觉得不舒服我只能说个人的理解不一样。
这个类一看就知道应该是底层协议用的,当然是比较底层的。
4 楼
whaosoft
2010-12-17
这好用吗??
3 楼
gdpglc
2010-12-17
"0123456789ABCDEF".charAt(left)
地方还可以优化
char[] chs={'0','1'........'F'}
chs[left]
不过我一定不会这么用。我宁可用Character.forDigit方法,这样的代码可读性太差了。这么在乎性能的理由是什么?你在写系统软件吗?
把乘2写成<<1,唉。我觉得真是精力过剩了..........
这哪能叫重构.... 整个一个反重构
地方还可以优化
char[] chs={'0','1'........'F'}
chs[left]
不过我一定不会这么用。我宁可用Character.forDigit方法,这样的代码可读性太差了。这么在乎性能的理由是什么?你在写系统软件吗?
把乘2写成<<1,唉。我觉得真是精力过剩了..........
这哪能叫重构.... 整个一个反重构
2 楼
wumingshi
2010-12-17
效率肯定高了但是可读性基本上没有任何好转。
1 楼
yangyi
2010-12-16
很不错,看不出什么继续优化的地方了
发表评论
-
实践中的重构32_使用标准的IO操作写法。
2012-07-14 18:42 1447看到这样一段代码,功能为读取一个指定文件的内容然后返回。 ... -
实践中的重构31_结果类两种实现的比较
2011-09-13 19:58 1099在查询接口结果类设计 ... -
实践中的重构30_不做油漆匠
2011-08-15 23:42 1302油漆匠的故事是编程文化中的一个著名故事。本地化如下。 小强毕业 ... -
实践中的重构29_不自动的自动化测试
2011-07-31 18:00 1071测试的精髓之一就是自 ... -
实践中的重构28_小心怀疑类库
2011-07-24 10:25 1073一般而言,类库的使用频率较高,场景较多,隐藏的bug就较少。 ... -
实践中的重构27_不要忘了内存空间
2011-06-06 18:31 1198方法在设计中,一般关注的是方法的功能契约,即方法需要什么样的参 ... -
实践中的重构26_奇怪的接口注释
2011-06-06 16:10 1366最近又看到奇怪的注释。 /** * 用户查询服务。 ... -
实践中的重构25_UT也需要持续重构
2011-05-01 11:20 1076UT是个好东西,在对代 ... -
实践中的重构24_持续的方法重构
2011-05-01 02:20 1100很少有人可以一遍就写出好的代码。写代码和写文章差不多,大部分人 ... -
实践中的重构23_详尽的注释未必是好注释
2011-03-20 17:37 1563注释一直是软件开发中的一个老大难问题。 代码中一个注释都没有是 ... -
实践中的重构22_不要垃圾
2011-03-20 13:31 1074Java引入了GC当然很好,减轻了程序员手工管理内存的负担,但 ... -
实践中的重构21_给她一个好名字
2011-03-20 13:03 927名字的重要性实在是再怎么强调都不为过的。 为什么名字这么重要呢 ... -
实践中的重构20_一段可笑的异常处理逻辑
2011-03-06 20:32 1723Code review也是一个充满 ... -
实践中的重构19_脱裤子放屁
2011-03-03 23:17 2085每当看到代码中有一个 ... -
实践中的重构18_不对称的美
2011-02-26 22:30 1002一般而言,自然界是以 ... -
实践中的重构17_表驱动法
2011-02-22 00:10 874代码以及初始的单元测试见 http://zhang-xzhi- ... -
实践中的重构16_多即是少
2011-01-16 23:44 1528在编写UT的过程中,随处可见重复,硬编码等等使得代码僵化的代码 ... -
实践中的重构15_null的意义和集合类作为方法结果类型
2011-01-12 22:16 657在编程中,估计null应该是一个很常写的词汇了。 实践中,经常 ... -
实践中的重构14_用方法设计保证正确性
2011-01-04 21:40 1033一般来说,方法的调用方遵循方法的契约调用某方法来完成某功能。每 ... -
实践中的重构13_利用递归提高代码的可维护性
2010-12-30 01:38 748有这么一段代码,是用来解析国内的地址信息的。 AddressI ...
相关推荐
描述中的“幅值谱重构语音”指的是从MFCC中恢复出幅度谱,然后使用IFFT将其转换回时间序列。 **谱重构**是指根据频率域信息(如幅度谱或功率谱)重建原始信号的过程。在语音处理中,谱重构对于语音识别、语音合成...
总的来说,EMD重构是将EMD分解后的IMF重新整合,以理解并恢复原始信号的重要过程,这一过程在各种科学与工程领域有着广泛的应用。提供的MATLAB代码"EMDchonggou.m"是实现这一过程的具体工具,对于研究和应用EMD的...
标题中的“用于信号的EMD、EEMD、VMD分解_vmd重构_故障诊断emd_故障诊断_故障重构_VMD信号重构_源码.rar.rar”揭示了该压缩包文件包含的是与信号处理相关的源代码,特别是涉及了三种重要的信号分解方法:Empirical ...
重构__改善既有代码的设计_高清 绝对清晰
牛顿拉普逊法就算配电网重构的潮流程序,结构清晰易懂。
配电网重构是电力系统领域中的一个重要研究课题,它涉及到电力系统的稳定运行与经济效率。配电网重构的目标是在满足一系列约束条件下,通过改变开关状态,优化网络结构,以达到提高供电可靠性、降低运营成本、改善...
《重构:改善既有代码设计》是一本由Martin Fowler所著的经典IT著作,它详细阐述了在软件开发过程中如何通过重构来提升代码质量、可读性和维护性。重构是一种系统性的方法,旨在不改变软件外在行为的前提下,改进其...
在本文中,我们将深入探讨基于Matlab的压缩感知(Compressive Sensing,简称CS)重构算法的实现。压缩感知是一种理论先进的信号处理方法,它允许我们以远低于奈奎斯特定理所要求的采样率捕获信号,并能恢复原始信号...
在IT行业中,尤其是在医疗影像处理领域,三维重构技术扮演着至关重要的角色。"NewPrjName.rar" 是一个与三维医学图像重构相关的项目文件压缩包,它涉及到的是使用C++编程语言来实现这一复杂的计算过程。这个项目的...
资源名:用于信号的EMD、EEMD、VMD分解_vmd重构_故障诊断emd_故障诊断_故障重构_VMD信号重构 资源类型:matlab项目全套源码 源码介绍:用于信号的分解、降噪和重构,实现故障诊断 源码说明: 全部项目源码都是经过...
压缩传感重构算法中的子空间追踪算法,用于信号的重构
这个压缩包中的"第13章 MATLAB图像重构实战"可能包含了一系列的MATLAB脚本和函数,用于演示如何使用MATLAB实现fanbeam变换。这些脚本可能包括数据读取、预处理、fanbeam投影、反投影以及图像重构等步骤。在学习和...
在IT领域,尤其是在信号处理和数据采集系统中,压缩感知(Compressed Sensing,简称CS)是一个非常重要的理论。这个理论突破了传统采样定理的限制,允许以远低于奈奎斯特定理所规定的速率对信号进行采样,然后通过...
在电力系统领域,配电网重构是一项关键的技术,其目的是通过改变配电网络的...总之,配电网重构源码的获取为研究和实践提供了宝贵的工具,通过深入学习和应用,可以提升电力系统的运行效率,为智能电网的发展做出贡献。
北理新源,TBOX项目RTT代码重构项目_BTFS_TBOX_RTT
在IT领域,压缩感知(Compressed ...综上所述,“cs-code.zip”包含的MATLAB源代码是学习和研究压缩感知重构算法的重要资源,通过对各种算法的实践和分析,有助于深入理解压缩感知的核心原理及其在实际问题中的应用。
经验模态分解(Empirical Mode Decomposition,简称EMD)是一种强大的数据分析技术,尤其...通过对这些资源的深入理解和实践,我们可以更好地掌握EMD技术,并将其应用到实际问题中,实现非平稳信号的有效分析和重构。
在本项目中,作者计算了重构图像与原始图像的误差,这是评估重构质量的重要指标。通常使用的误差度量有均方误差(Mean Square Error, MSE)、峰值信噪比(Peak Signal-to-Noise Ratio, PSNR)等。MSE是衡量两个图像...
用户重构0113_20160129094530.rp,用户系统重构产品设计,原型和设计