`
laodizhuq
  • 浏览: 26119 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

代码优化1-谨慎使用已有的方法

 
阅读更多
工程中有段代码是对属性值做压缩的代码,实现的功能是:例如pid1:vid11;pid1:vid12;pid2:vid2,压缩后为pid1:vid11,vid12;pid2:vid2

原先代码如下:

public static String compressPropertyString(String prop) {
	Map<Integer, List<Integer>> map = propString2map(prop);
	StringBuilder sb = new StringBuilder();
	for (Integer pid : map.keySet()) {
		List<Integer> vals = map.get(pid);
		sb.append(pid).append(psubSp);
		int i = 0;
		for (Integer vid : vals) {
			if (i > 0) {
				sb.append(parrSp);
			}
			sb.append(vid);
			++i;
		}
		sb.append(pmainSp);
	}
	return sb.toString();
}
public static Map<Integer, List<Integer>> propString2map(String properties) {
	Map<Integer, List<Integer>> map = new LinkedHashMap<Integer, List<Integer>>();
	if (StringUtil.isNotBlank(properties)) {
		String[] pairs = StringUtil.split(properties, pmainSp);
		if (null != pairs) {
			for (String pair : pairs) {
				String pv[] = StringUtil.split(pair, psubSp);
				Integer pid = new Integer(pv[0]);
				String vstr = pv[1];
				String[] vidarr = StringUtil.split(vstr, parrSp);
				for (String vidstr : vidarr) {
					Integer vid = new Integer(vidstr);
					List<Integer> vids = map.get(pid);
					if (null == vids) {
						vids = new ArrayList<Integer>();
						map.put(pid, vids);
					}
					if (!vids.contains(vid)) {
						vids.add(vid);
					}
				}
			}
		}
	}
	return map;
}

原先代码中有一个方法propString2map(),次方法是将属性串解析成Map<Integer, List<Integer>>,次方法就直接调用了原有的这个方法,这段话压缩代码就很简单了,直接根据解析出来的Map拼装成字符串就ok了。
但是作者没有考虑propString2map()方法有一个处理是将里面的值都转换成了int,然后压缩时又转换成String。这么一个来回转换,完全是没有必要的。
所以对此方法进行了重构,代码如下:
public static String compressPropertyString(String prop) {
	if(StringUtil.isBlank(prop)) return prop;
	StringBuilder sb = new StringBuilder(prop.length());
	
	String[] ps = StringUtil.split(prop,pmainSp);
	if(ps == null) return prop;
	Map<String,String> tmpMap = new LinkedHashMap<String,String>();
	for(String pss : ps) {
		String pv[] = StringUtil.split(pss,":");
		
		if(tmpMap.containsKey(pv[0])) {
			tmpMap.put(pv[0], tmpMap.get(pv[0]) +parrSp+ pv[1]);
		}else {
			tmpMap.put(pv[0], pv[1]);
		}
	}
	for(String key: tmpMap.keySet()) {
		sb.append(key).append(psubSp).append(tmpMap.get(key)).append(pmainSp);
	}
	return sb.toString();
}

执行测试结果如下:
 public static void main(String args[] ) {
	String s = "111:231;222:423;333:412;444:7523;111:610;111:868;444:852;555:123;666:513";
	long start = System.currentTimeMillis();
	String ss = null;
	for(int i=0; i<1000000; i++) {
		ss = PropertyUtils.compressPropertyString(s);
	}
	System.out.println(ss+" cost:"+(System.currentTimeMillis()-start));
 }

优化前:
111:231,610,868;222:423;333:412;444:7523,852;555:123;666:513; cost:11043
优化后:
111:231,610,868;222:423;333:412;444:7523,852;555:123;666:513; cost:5953
可以看到,优化前后执行时间相差一半。

这个优化点,对于性能要求不高的应用来说没有必要。
对性能要求较高的应用,在写代码时就需要考虑,用到某个功能时,是直接使用已经实现的功能,还是自己重新实现一遍更高效的代码。
分享到:
评论

相关推荐

    C代码优化教程

    本文档将详细介绍一些有效的代码优化策略,适用于已有一定编程基础的程序员。 #### 三、代码优化策略 ##### 3.1 使用数组索引 - **背景**:在需要根据变量值设置特定字符或数据时,传统的方法可能是使用`switch`...

    C++优化方法C++有效使用内存

    本文将深入探讨C++中的优化方法,特别是关于如何有效地使用内存。 一、内存管理基础 在C++中,内存分为栈内存(Stack)和堆内存(Heap)。栈内存由编译器自动管理,用于存储局部变量,其分配和释放速度快,但空间...

    j2objcJava转成Objective-C的用于移植Android库到iOS

    这样,你可以利用已有的Java库,而不必重新编写iOS版本。 4. **性能优化**:虽然j2objc提供了Java到Objective-C的转换,但是需要注意的是,转换后的代码可能在性能上不如原生的Objective-C或Swift代码。因此,对于...

    jd-gui 代码反编译

    代码反编译是一种技术,它允许开发者从已编译的字节码中恢复源代码,以便于理解程序的运行机制、学习新库的内部工作原理或者在没有源代码的情况下进行调试。JD-GUI 是一款非常实用的代码反编译工具,尤其在Java开发...

    重构-改善既有代码的设计.rar

    同时,持续集成和自动化测试也是重构的重要保障,它们确保在重构过程中不会破坏已有的功能。 在实际应用中,重构不仅仅适用于新项目,对于维护老旧系统或者遗留代码也同样重要。通过逐步的、谨慎的重构,可以使得...

    JDGUI反编译工具及编译文件注释移除代码

    总的来说,JDGUI是Java开发者的一个重要工具,它可以帮助我们理解已编译的代码,而`JDGUIRemarkRemover.java`则提供了一种方法来进一步处理反编译后的源代码,以满足特定的需求,如去除注释。在进行这些操作时,应...

    js代码-项目优化代码测试

    针对"js代码-项目优化代码测试"这个主题,我们将深入探讨JavaScript代码优化的各种策略和技术。在实际项目中,优化代码不仅能够提升用户体验,减少加载时间,还能降低服务器负载,增强整体应用的可维护性和扩展性。 ...

    Excel-VBA宏编程实例源代码-数据的导入导出-自动导入文本文件.zip

    - 使用`Sub`关键字定义宏,然后编写调用`Workbooks.OpenText`的代码,指定要导入的文本文件路径和其它配置参数。 - 可以选择将宏添加到“开发者”选项卡的工具栏,或者设置为工作簿启动时自动运行。 4. **数据...

    40条优化PHP代码的小实例

    1. **静态方法的使用**:将方法声明为静态可以提高执行速度约四分之一。静态方法不依赖于类的实例,因此在调用时无需创建对象,从而减少了开销。 2. **echo与print的效率对比**:echo用于输出字符串,相比print具有...

    刷bios PXE-RPL代码

    总的来说,“刷BIOS PXE-RPL代码”是一项高级的IT任务,需要对硬件、网络引导和固件更新有深入的理解。它能帮助优化网络启动环境,但同时也要求操作者具备足够的技术和谨慎态度。在实际操作前,确保已做好充分的研究...

    react-native-tag-select修改源码的代码.rar

    用户可以通过输入框创建新的标签,也可以选择已有的标签。当用户点击已选择的标签时,标签的状态会从选中变为未选中,反之亦然。 2. **源码修改**:在你获取的"react-native-tag-select修改源码的代码.rar"压缩包中...

    40条优化php代码的小实例

    标题与描述中的知识点聚焦于PHP代码优化技巧,旨在提升代码执行效率、节省资源及改进编程实践。以下是对这些技巧的详细解析: 1. **静态方法的使用**:将合适的方法声明为静态,可以提高约四分之一的速度。静态方法...

    代码编写注意事项

    在编写代码时,首先考虑是否已有内置函数能满足需求,例如 `array_map()` 或 `array_filter()`。 2. **扩展实现高性能功能**:对于性能敏感的部分,考虑使用扩展或 C 扩展来增强性能。这可以通过编写 PHP 扩展或者...

    Leader统帅BCD-258WLDEBU1冰箱说明书.pdf

    - 冰箱上电后,需进入配置模式,方法是在锁定状态下同时按住“冷藏”和“变温”按键3秒,听到蜂鸣器响一声,智能图标开始闪烁,表示冰箱已进入配置模式。 - 配置过程中,按照手机客户端的指引进行绑定操作。如果...

    EXcelVBA另存之后删除按钮及宏代码

    ### 关键知识点三:代码优化建议 - **错误处理**:尽管使用了 `OnErrorResumeNext` 进行错误处理,但在实际应用中,建议使用更详细的错误处理机制来捕获特定类型的错误并进行适当处理。 - **代码可读性**:建议增加...

    seo代码优化之head部分.docx

    SEO(Search Engine Optimization)代码优化是提升网站在搜索引擎排名的关键步骤之一,特别是在head部分的优化,对于提升网站的可见性和用户体验至关重要。以下是对head部分各元素的详细解释: 1. 文件编码:`...

    C#编码好习惯,格式、代码

    - **谨慎使用sealed关键字**:如果一个类或方法被标记为`sealed`,则不能被继承或覆盖,应根据设计需求谨慎使用。 - **避免不安全代码**:使用COM互操作或直接调用DLL时,确保代码的安全性,避免不必要的不安全代码...

    优化php的若干建议

    - **解释**:复用已有的代码片段可以避免重复劳动,提高开发速度。 #### 37. 代码的调试 - **描述**:调试是确保代码质量的重要环节。 - **解释**:有效的调试技巧可以帮助开发者快速定位和解决问题,保证代码的...

    Java编程代码性能优化

    在代码优化的要求上,主要关注两方面:减小代码体积和提高运行效率。减小体积可以减少内存占用,提高程序加载速度;提高运行效率则意味着代码在执行时更少地消耗CPU和内存资源。 以下是一些常见的Java代码优化技巧...

Global site tag (gtag.js) - Google Analytics