之前做系统优化,通过线程执行堆栈的检测,找到一个模板类的瓶颈,场景是一个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作业的性能,提高大数据处理效率。这些实践不仅包括对Join操作、数据倾斜问题的优化,还包括对内存管理、任务并行度调整等方面的深入探讨,旨在帮助...
在Java编程中,大型方法(即超过2500行的方法)并不常见,通常是通过自动化工具生成,如模板编译或语言转换。...同时,理解JVM的内部工作原理,如编译策略和优化技术,对于提高Java应用程序的性能至关重要。
【LocalCache 学习小记1】 LocalCache 是一种本地高速缓存机制,它主要用于提升数据获取速度,尤其是在处理大量数据时,可以有效避免频繁访问远程数据库或分布式缓存,如 Redis 中的热键问题。LocalCache 不是...
1. 隐含参数:发现了一个可能导致性能下降的隐含参数`_fast_cursor_reexecute`,将其恢复到默认值false。 2. SGA调整:分配了30GB的SGA,但Shared Pool只有不到2GB,将其增加至10G以上。 3. PGA调整:适当调整PGA...
开发者通常会查看和修改源码来学习新技能,调试问题,或优化性能。这些压缩包可能包含的是不同课程或项目的源代码,比如"lesson_"开头的文件可能表示一系列的教程,而"Mp3Player"则可能是一个实际的音乐播放器应用的...
Vue 单页应用(SPA)优化是一项至关重要的工作,尤其是在现代 web 开发中,为了提供更好的用户体验,我们需要尽可能减少页面加载时间和提高性能。本文将详细介绍在 Vue 项目中进行优化的一些关键策略。 首先,我们...
JSP最终会被编译为Servlet执行,因此理解JSP生命周期和指令(如page、include、taglib)对优化性能和维护代码至关重要。 JDBC(Java Database Connectivity)是Java访问数据库的标准接口。在Java Web应用中,JDBC...
对于源码和工具的探索,理解CGContext的内部工作原理可以帮助我们优化性能。例如,了解如何正确地管理和释放CGContext资源,避免内存泄漏。同时,熟悉Apple提供的图形性能分析工具,如Instruments的Core Animation...
4. **性能优化**:对于大量图片的缩放,需要考虑性能优化,比如批量处理、多线程、GPU加速等手段。 5. **内存管理**:处理大图时,应避免一次性加载整个图像到内存,可以分块读取和处理。 6. **质量与体积平衡**:...
Redis的管理和监控工具也是其生态的一部分,如`redis-cli`命令行工具、`redis-stat`性能监控、`redisinsight`可视化界面等,它们帮助开发者更好地管理和优化Redis实例。 综上所述,Redis以其高效、灵活的特点在许多...
这对于我们自定义序列化逻辑或优化现有应用的性能都非常有价值。 5. **应用场景** - 在分布式服务间通信中,Hessian常用于构建轻量级的RPC(远程过程调用)框架,提供高效的二进制序列化能力。 - 在存储场景下,...
"visjs使用小记" Vis.js是一个动态的、基于浏览器的可视化库,能够处理大量的动态数据,并能够与这些数据进行交互操作。该库由Almende B.V公司开发,包含DataSet、Timeline和Graph组件。下面是Vis.js的知识点总结:...
4. **优化性能**:通过缓存、懒加载等技术优化DTree在大数据量下的性能。 在实际项目中,TestDTree可能是一个测试用例或者示例代码,用于演示DTree的正确使用和功能验证。开发者可以通过阅读和运行这些代码,更好地...
在J2EE开发中,开发者通常会利用各种开源项目来提升效率和应用质量。这篇小记主要关注了几个关键领域:持久...而缓存技术如OSCache则优化了性能。了解并熟练掌握这些工具和框架,是成为一名高效J2EE开发者的必要条件。
7. **调试与优化**:整合过程中可能会遇到性能、安全或兼容性问题,博主可能分享了这些问题的调试方法和优化策略。 8. **最佳实践**:博主可能提出了在Flex和J2EE整合中的一些最佳实践,如如何有效地分层设计,如何...
2. **Cache选项卡**:此选项卡用于查看CPU的L1、L2甚至L3缓存的容量、速度和延迟等参数,这些信息对于判断CPU性能和优化系统配置至关重要。 3. **主板选项卡**:在此可以获取主板制造商、型号、芯片组、BIOS版本等...
博客链接 "https://alex-cheung.iteye.com/blog/1819011" 可能提供了更具体的SQL使用技巧、案例分析或常见问题解答,例如优化查询性能、处理NULL值、使用窗口函数等。文件名 "01.sql" 提示可能包含一个示例SQL脚本,...
在提供的文章中,作者讨论了关于匹配字符串字面量的正则表达式,并对其性能进行了优化。 首先,文章提到了一个基本的正则表达式 /"(?:.|[^"])*"/,这个表达式能够匹配被双引号括起来的任何内容。然而,这个表达式并...