`
jjw
  • 浏览: 65627 次
文章分类
社区版块
存档分类
最新评论

性能优化小记(1)

阅读更多

之前做系统优化,通过线程执行堆栈的检测,找到一个模板类的瓶颈,场景是一个2级下拉菜单,当时为了支持下拉菜单 键盘输入按拼音自动选择,在下拉菜单的属性里有一个值表示当前选择的中文词语的首字母串。如:

<option cls="ZHRMGHG">中华人民共和国</options>

....

由于这个菜单的option比较多,

有个工具类用来解析中文转拼音的工作,这个工具类存在性能瓶颈,主要原因是进行大量的中文encode

private final static int compare(String str1, String str2) {
		int result = 0;
		String s1 = EMPTY_STRING;
		String s2 = EMPTY_STRING;

		try {
			s1 = new String(str1.getBytes(_FromEncode_), _ToEncode_);
			s2 = new String(str2.getBytes(_FromEncode_), _ToEncode_);
		} catch (Exception e) {
			return str1.compareTo(str2);
		}

		result = chineseCompareTo(s1, s2);

		return result;
	}

	public final static int chineseCompareTo(String s1, String s2) {
		int len1 = s1.length();
		int len2 = s2.length();
		int n = Math.min(len1, len2);

		for (int i = 0; i < n; i++) {
			int s1Code = getCharCode(Character.toString(s1.charAt(i)));
			int s2Code = getCharCode(Character.toString(s2.charAt(i)));

			if ((s1Code * s2Code) < 0) {
				return Math.min(s1Code, s2Code);
			}

			if (s1Code != s2Code) {
				return s1Code - s2Code;
			}
		}

		return len1 - len2;
	}
	
	private final static int getCharCode(String s) {
		if ((s == null) || s.equals("")) {
			return -1;
		}

		byte[] b = s.getBytes();
		int value = 0;

		for (int i = 0; (i < b.length) && (i <= 2); i++)
			value = (value * 100) + b[i];

		return value;
	}

	public final static String getBeginCharacter(String res) {
		String a = res;
		String result = EMPTY_STRING;

		for (int i = 0; i < a.length(); i++) {
			String current = a.substring(i, i + 1);
			if (compare(current, "\u554A") < 0) {
				result = result + current;
			} else if ((compare(current, "\u554A") >= 0)
					&& (compare(current, "\u5EA7") <= 0)) {
				if (compare(current, "\u531D") >= 0) {
					result = result + "z";
				} else if (compare(current, "\u538B") >= 0) {
					result = result + "y";
				} else if (compare(current, "\u6614") >= 0) {
					result = result + "x";
				} else if (compare(current, "\u6316") >= 0) {
					result = result + "w";
				} else if (compare(current, "\u584C") >= 0) {
					result = result + "t";
				} else if (compare(current, "\u6492") >= 0) {
					result = result + "s";
				} else if (compare(current, "\u7136") >= 0) {
					result = result + "r";
				} else if (compare(current, "\u671F") >= 0) {
					result = result + "q";
				} else if (compare(current, "\u556A") >= 0) {
					result = result + "p";
				} else if (compare(current, "\u54E6") >= 0) {
					result = result + "o";
				} else if (compare(current, "\u62FF") >= 0) {
					result = result + "n";
				} else if (compare(current, "\u5988") >= 0) {
					result = result + "m";
				} else if (compare(current, "\u5783") >= 0) {
					result = result + "l";
				} else if (compare(current, "\u5580") >= 0) {
					result = result + "k";
				} else if (compare(current, "\u51FB") > 0) {
					result = result + "j";
				} else if (compare(current, "\u54C8") >= 0) {
					result = result + "h";
				} else if (compare(current, "\u5676") >= 0) {
					result = result + "g";
				} else if (compare(current, "\u53D1") >= 0) {
					result = result + "f";
				} else if (compare(current, "\u86FE") >= 0) {
					result = result + "e";
				} else if (compare(current, "\u642D") >= 0) {
					result = result + "d";
				} else if (compare(current, "\u64E6") >= 0) {
					result = result + "c";
				} else if (compare(current, "\u82AD") >= 0) {
					result = result + "b";
				} else if (compare(current, "\u554A") >= 0) {
					result = result + "a";
				}
			}
		}
		
		if (result.length() <=0)
			result = OTHER_TYPE;
		
		return result;
	}

	/**
	 * 得到字符串首字符的拼音首字母	 */
	public final static String getFirstSpell(String str) {
		String result = null;
		
		if (null != str && str.length() > 0) {
			char a = str.charAt(0);
			
			if (Character.isDigit(a)) {
				result = OTHER_TYPE;
			} else if (((a >= 'a') && (a <= 'z')) || ((a >= 'A') && (a <= 'Z'))) {
				result = Character.toString(a).toLowerCase();
			} else {
				result = getBeginCharacter(Character.toString(a));
			}
		}
		
		return result;
	}

 

大家看到这个问题之后第一想法就是优化这段代码

其实解决这个性能问题也有另外一种思路,由于option里的中文词语是有限的,可以枚举的,所以完全可以进行cache

做一个词语对应字母的map,通过这个可以有效的提升代码性能

分享到:
评论

相关推荐

    spark优化实践小记

    综上所述,通过综合运用上述策略和技术手段,可以有效优化Spark作业的性能,提高大数据处理效率。这些实践不仅包括对Join操作、数据倾斜问题的优化,还包括对内存管理、任务并行度调整等方面的深入探讨,旨在帮助...

    大方法的执行性能与调优过程小记1

    在Java编程中,大型方法(即超过2500行的方法)并不常见,通常是通过自动化工具生成,如模板编译或语言转换。...同时,理解JVM的内部工作原理,如编译策略和优化技术,对于提高Java应用程序的性能至关重要。

    LocalCache 学习小记1

    【LocalCache 学习小记1】 LocalCache 是一种本地高速缓存机制,它主要用于提升数据获取速度,尤其是在处理大量数据时,可以有效避免频繁访问远程数据库或分布式缓存,如 Redis 中的热键问题。LocalCache 不是...

    KDB和Oracle的性能pk小记

    1. 隐含参数:发现了一个可能导致性能下降的隐含参数`_fast_cursor_reexecute`,将其恢复到默认值false。 2. SGA调整:分配了30GB的SGA,但Shared Pool只有不到2GB,将其增加至10G以上。 3. PGA调整:适当调整PGA...

    android开发小记

    开发者通常会查看和修改源码来学习新技能,调试问题,或优化性能。这些压缩包可能包含的是不同课程或项目的源代码,比如"lesson_"开头的文件可能表示一系列的教程,而"Mp3Player"则可能是一个实际的音乐播放器应用的...

    详解Vue SPA项目优化小记

    Vue 单页应用(SPA)优化是一项至关重要的工作,尤其是在现代 web 开发中,为了提供更好的用户体验,我们需要尽可能减少页面加载时间和提高性能。本文将详细介绍在 Vue 项目中进行优化的一些关键策略。 首先,我们...

    java小记.rar

    JSP最终会被编译为Servlet执行,因此理解JSP生命周期和指令(如page、include、taglib)对优化性能和维护代码至关重要。 JDBC(Java Database Connectivity)是Java访问数据库的标准接口。在Java Web应用中,JDBC...

    CGContext 小记

    对于源码和工具的探索,理解CGContext的内部工作原理可以帮助我们优化性能。例如,了解如何正确地管理和释放CGContext资源,避免内存泄漏。同时,熟悉Apple提供的图形性能分析工具,如Instruments的Core Animation...

    图片缩放 小记

    4. **性能优化**:对于大量图片的缩放,需要考虑性能优化,比如批量处理、多线程、GPU加速等手段。 5. **内存管理**:处理大图时,应避免一次性加载整个图像到内存,可以分块读取和处理。 6. **质量与体积平衡**:...

    Redis小记

    Redis的管理和监控工具也是其生态的一部分,如`redis-cli`命令行工具、`redis-stat`性能监控、`redisinsight`可视化界面等,它们帮助开发者更好地管理和优化Redis实例。 综上所述,Redis以其高效、灵活的特点在许多...

    Hessian 的字段序列化小记

    这对于我们自定义序列化逻辑或优化现有应用的性能都非常有价值。 5. **应用场景** - 在分布式服务间通信中,Hessian常用于构建轻量级的RPC(远程过程调用)框架,提供高效的二进制序列化能力。 - 在存储场景下,...

    visjs使用小记

    "visjs使用小记" Vis.js是一个动态的、基于浏览器的可视化库,能够处理大量的动态数据,并能够与这些数据进行交互操作。该库由Almende B.V公司开发,包含DataSet、Timeline和Graph组件。下面是Vis.js的知识点总结:...

    树形菜单DTree使用小记

    4. **优化性能**:通过缓存、懒加载等技术优化DTree在大数据量下的性能。 在实际项目中,TestDTree可能是一个测试用例或者示例代码,用于演示DTree的正确使用和功能验证。开发者可以通过阅读和运行这些代码,更好地...

    J2EE开发之常用开源项目小记

    在J2EE开发中,开发者通常会利用各种开源项目来提升效率和应用质量。这篇小记主要关注了几个关键领域:持久...而缓存技术如OSCache则优化了性能。了解并熟练掌握这些工具和框架,是成为一名高效J2EE开发者的必要条件。

    Flex整合J2EE开发小记+源码下载

    7. **调试与优化**:整合过程中可能会遇到性能、安全或兼容性问题,博主可能分享了这些问题的调试方法和优化策略。 8. **最佳实践**:博主可能提出了在Flex和J2EE整合中的一些最佳实践,如如何有效地分层设计,如何...

    火眼金睛辨真假 小记CPU-Z软件.pdf

    2. **Cache选项卡**:此选项卡用于查看CPU的L1、L2甚至L3缓存的容量、速度和延迟等参数,这些信息对于判断CPU性能和优化系统配置至关重要。 3. **主板选项卡**:在此可以获取主板制造商、型号、芯片组、BIOS版本等...

    SQL学习小记

    博客链接 "https://alex-cheung.iteye.com/blog/1819011" 可能提供了更具体的SQL使用技巧、案例分析或常见问题解答,例如优化查询性能、处理NULL值、使用窗口函数等。文件名 "01.sql" 提示可能包含一个示例SQL脚本,...

    js 正则学习小记之匹配字符串字面量优化篇

    在提供的文章中,作者讨论了关于匹配字符串字面量的正则表达式,并对其性能进行了优化。 首先,文章提到了一个基本的正则表达式 /"(?:.|[^"])*"/,这个表达式能够匹配被双引号括起来的任何内容。然而,这个表达式并...

Global site tag (gtag.js) - Google Analytics