访问字符串内字符的几种方法的性能测试

synhy synhy 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
尝想做个处理文本的程序,考虑性能,对想到的访问字符串内单个字符的性能做个测试,简单写了个程序打印耗时,也好有个量的概念。代码如下:
public class test{
public test(){
}

public static void main(String argv[])
{
String test="..."; //很长的测试字符串
StringBuffer test1=new StringBuffer(test);
int i,j,ilen = test.length(),times=100000; //每种方式测试次数
char ch;
byte chset[];
long t1=0,t2=0;
System.out.println("test string length:" + String.valueOf(ilen) + "Bytes"); //打印测试字符串长度

t1 = System.currentTimeMillis();
for(j=0;j<times;j++){
for(i=0;i<ilen;i++){
ch = test.charAt(i);
}
i=0;
}

t2 = System.currentTimeMillis();
System.out.println("test1 over:" + String.valueOf(t2-t1) + "ms");
chset = test.getBytes();
t2 = System.currentTimeMillis();

for(j=0;j<times;j++){
for(i=0;i<ilen;i++){
ch = (char)chset[i];
}
i=0;
}

t1 = System.currentTimeMillis();
System.out.println("test2 over:" + String.valueOf(t1-t2) + "ms");
ilen = test1.length();
t1 = System.currentTimeMillis();

for(j=0;j<times;j++){
for(i=0;i<ilen;i++){
ch = test1.charAt(i);
}
i=0;
}
t2 = System.currentTimeMillis();
System.out.println("test3 over:" + String.valueOf(t2-t1) + "ms");
}
}
运行结果如下:
D:\Program\J2SE>java test
test string length:7708Bytes
test1 over:3657ms
test2 over:2156ms
test3 over:15750ms

D:\Program\J2SE>java test
test string length:7708Bytes
test1 over:3671ms
test2 over:2156ms
test3 over:15688ms

D:\Program\J2SE>java test
test string length:7708Bytes
test1 over:3672ms
test2 over:2172ms
test3 over:15141ms

简要分析:
方式1:直接用String.charAt(i) 访问,可能是多了一个函数调用,增加了耗时,里面应该也是数组的形式访问的;
方式2:先将String转成数组,速度较快,每次耗时大概是方式1的60%。
方式3:使用StringBuffer.charAt(i)访问,速度慢的太多了。Buffer的方式应该是适合字符串的添加删除操作,用来访问字符,速度太慢。

后记:
暂时只想到了这么几种方式。
想既然数据都出来了,就发上来供大家看看。各种方式为何时间差别较大,有谁知道的也望告知一下。
...全文

相关推荐

有用的函数、教程和其他与 Python 相关的东西.zip

有用的脚本、教程和其他 Python 相关内容的集合// Python 技巧和教程// Python 和网络// 算法// 绘图和可视化// 基准// Python 和“数据科学”// 有用的脚本和片段// 其他// 链接Python 技巧和教程 [返回顶部]您应该知道的不那么明显的 Python 内容集合![ IPython nb ]Python 的变量名范围解析和 LEGB 规则 [ IPython nb ]Python 2.x 和 Python 3.x 之间的主要区别 [ IPython nb ]Python 中 SQLite 数据库操作详解 [ Markdown ]Python 中的单元测试 - 为什么我们要养成习惯 [ Markdown ]在 MacOS 10.9 Mavericks 上安装 Python3 的科学计算软件包 [ Markdown ]使用 Python csv 模块对 CSV 文件进行排序 [ IPython nb ]使用带有和不带有 IPython magic 的 Cython [ IPython

徐浪老师

python进阶教程之循环相关函数range、enumerate、zip

在“循环”一节,我们已经讨论了Python基本的循环语法。这一节,我们将接触更加灵活的循环方式。 range() 在Python中,for循环后的in跟随一个序列的话,循环每次使用的序列元素,而不是序列的下标。 之前我们已经使用过range()来控制for循环。现在,我们继续开发range的功能,以实现下标对循环的控制: 复制代码 代码如下: S = ‘abcdefghijk’ for i in range(0,len(S),2):     print S[i] 在该例子中,我们利用len()函数和range()函数,用i作为S序列的下标来控制循环。在range函数中,分别定义上限,下限和每次

weixin_38639237

Python安装包和教程.zip

python Windows安装包,和python教程

qq_26331879

Python range、enumerate和zip函数用法详解

主要介绍了Python range、enumerate和zip函数用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

weixin_38559992

Python中zip函数如何使用

介绍 zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。 ps. 如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。 例子 a = [1,2,3] b = [4,5,6] c = [4,5,6,7,8] zipped = zip(a,b) # 打包为元组的列表 # 输出:[(1, 4), (2, 5), (3, 6)] zip(a,c) # 元素个数与最短的列表一致 # 输出:[(1, 4), (2, 5), (3, 6)] zip(*zipped) # 与 zip 相反,*z

weixin_38576811
评论
收藏 已收藏
分享
返回顶部
synhy
Java SE 62,621 成员 307,251 内容