搜索
查看: 9276|回复: 16

如何提高替换的效率??

[复制链接]

40

主题

143

帖子

936

积分

三级会员

Rank: 4

积分
936
发表于 2011-11-18 19:41:19 | 显示全部楼层 |阅读模式
本帖最后由 zyzy135 于 2011-11-18 19:42 编辑

在多线程中处理文本,进行分割替换。量较大。
现遇到的问题是在一个for循环中进行替换,如果在循环中加win.delay(1)吧,cpu一直在10%以下,但替换的时间太长了。如果不加win.delay(1)吧,cpu眼睁睁的看着它上100%,纠结呀。加还是不加呢?
下面是模拟真实处理情况的精简代码。请各位看官看看如何提高它的效率呀!
难道鱼和熊掌就不能兼得??

import win
io.open();

var str=""
for(i=1;100;1){
    str +=
"这是任意字符串这是字符串"
}
io.print(
"开始测试")


//不使用win.delay(1),这里的cpu使用很高,但较快,如果在多线程中,cpu很快就100%
t1=time.tick()
for(i=1;10000;1){
    str=string.replace(str,
"字符串","字符串")
}
t2=time.tick()
io.print(
"测试1完成,用时:",t2-t1)


//这里使用win.delay(1),cpu使用很低,但很耗时。
for(i=1;10000;1){
    str=string.replace(str,
"字符串","字符串")
    win.delay(1)
}
t3=time.tick()
io.print(
"测试2完成,用时:",t3-t2)

execute("pause")
io.close();

回复

使用道具 举报

75

主题

849

帖子

5049

积分

六级会员

The only one

Rank: 9Rank: 9Rank: 9

积分
5049
发表于 2011-11-18 20:18:16 来自手机 | 显示全部楼层

把win.delay(1);换成sleep(0)就可以了!

把win.delay(1);换成sleep(0)就可以了!
小时候,幸福是一件东西,拥有就是幸福; 长大了,幸福是一个目标,达到就是幸福; 成熟后,发现幸福原来是一种心态,领悟就是幸福.
回复

使用道具 举报

40

主题

143

帖子

936

积分

三级会员

Rank: 4

积分
936
 楼主| 发表于 2011-11-18 20:42:06 | 显示全部楼层

谢谢look 在程序中换成sleep(0)后,开了5个线程,cpu还是100%,开1个线程,cpu大约在30%左右。问题还未解决。

谢谢look
在程序中换成sleep(0)后,开了5个线程,cpu还是100%,开1个线程,cpu大约在30%左右。问题还未解决。
回复

使用道具 举报

43

主题

679

帖子

3805

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3805
发表于 2011-11-18 20:51:31 | 显示全部楼层

系统的资源是有限的,你指望他CPU一核能顶八核的用?

系统的资源是有限的,你指望他CPU一核能顶八核的用?
回复

使用道具 举报

75

主题

849

帖子

5049

积分

六级会员

The only one

Rank: 9Rank: 9Rank: 9

积分
5049
发表于 2011-11-18 21:03:12 来自手机 | 显示全部楼层

把你的真实代码发上来,优化你的代码,多线程不一定效率就高!耗时的程序就让它耗时吧,安装windows也不可能1秒就完成!程序设计成cpu占有过高很不友好!

把你的真实代码发上来,优化你的代码,多线程不一定效率就高!耗时的程序就让它耗时吧,安装windows也不可能1秒就完成!程序设计成cpu占有过高很不友好!
小时候,幸福是一件东西,拥有就是幸福; 长大了,幸福是一个目标,达到就是幸福; 成熟后,发现幸福原来是一种心态,领悟就是幸福.
回复

使用道具 举报

65

主题

953

帖子

5036

积分

荣誉会员

Rank: 8Rank: 8

积分
5036
发表于 2011-11-18 21:23:20 | 显示全部楼层

开了5个线程,cpu还是100%,开1个线程,cpu大约在30%左右 这还不行啊?...

开了5个线程,cpu还是100%,开1个线程,cpu大约在30%左右

这还不行啊?...
aaa
回复

使用道具 举报

2

主题

37

帖子

257

积分

新手入门

积分
257
发表于 2011-11-18 21:40:23 | 显示全部楼层

这种替换要想效率高的话,就用模式匹配替换,不要一直循环

这种替换要想效率高的话,就用模式匹配替换,不要一直循环
回复

使用道具 举报

40

主题

143

帖子

936

积分

三级会员

Rank: 4

积分
936
 楼主| 发表于 2011-11-18 22:02:35 | 显示全部楼层

[i=s] 本帖最后由 zyzy135 于 2011-11-18 22:08 编辑 [/i] 公司有规定,代码不便帖出。 大致流程: 主线程从数据库中读出

本帖最后由 zyzy135 于 2011-11-18 22:08 编辑

公司有规定,代码不便帖出。
大致流程:
主线程从数据库中读出数据,写入共享表中,创建子线程,等待线程结束。
子线程循环从共享表中取一数据,处理数据,写入数据库中。

经过多次注释代码段,最后找到是 循环中的string.replace()的原因,注释此句后,cpu正常。
取消注释后,cpu就很高。

谢谢楼上的朋友们的关注。

回复

使用道具 举报

75

主题

849

帖子

5049

积分

六级会员

The only one

Rank: 9Rank: 9Rank: 9

积分
5049
发表于 2011-11-18 22:18:46 来自手机 | 显示全部楼层

模式匹配表达式写得不好同样可以使效率下降!就把你注释的replace语句原句贴出来,前后精简一下,看看能不能帮你!

模式匹配表达式写得不好同样可以使效率下降!就把你注释的replace语句原句贴出来,前后精简一下,看看能不能帮你!
小时候,幸福是一件东西,拥有就是幸福; 长大了,幸福是一个目标,达到就是幸福; 成熟后,发现幸福原来是一种心态,领悟就是幸福.
回复

使用道具 举报

43

主题

679

帖子

3805

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3805
发表于 2011-11-18 22:22:15 | 显示全部楼层

[i=s] 本帖最后由 编程 于 2011-11-18 22:39 编辑 [/i] 注释了string.replace() 等于什么都没干,空循环当然不占CP

本帖最后由 编程 于 2011-11-18 22:39 编辑

注释了string.replace() 等于什么都没干,空循环当然不占CPU.

按你贴出来的代码也不会占CPU,下面的代码执行速度非常快,也不会占CPU
io.open()

str = "字符串"
for(i=1;10000;1){
    str=string.replace(str,
"字符串","字符串")
   
sleep(0)
}

io.print(
"OK")

你现在的问题是文件太大,
一个人只能挑一百斤,你让他挑一千斤,
而且又要求他占更少的CPU,花更少的时间,这本身就是一个矛盾的需求。

任何代码都有优化的空间,
但是看不到有问题的数据和代码,凭空想象别人不太好帮你。


回复

使用道具 举报

43

主题

679

帖子

3805

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3805
发表于 2011-11-18 22:36:30 | 显示全部楼层

[i=s] 本帖最后由 编程 于 2011-11-18 22:37 编辑 [/i] 具体问题要具体对待,模式匹配不同的用法也会有效率的区别。 下面两段代码做

本帖最后由 编程 于 2011-11-18 22:37 编辑

具体问题要具体对待,模式匹配不同的用法也会有效率的区别。
下面两段代码做同样的事,不过占用的资源那就差距千百倍了
//下面的代码执行 130毫秒
import time.performance;
io.open()

tick = time.performance.tick()
str  = string.load( io._exepath )
i,j = string.find(str,
".*(aardio)")
io.print( time.performance.tick() - tick )


//下面的代码执行 0.9 毫秒
import time.performance;
io.open()
tick = time.performance.tick()
for line in io.lines(io._exepath) {
    i,j = string.find(line ,
"aardio")
   
if(i)break;
}
io.print( time.performance.tick() - tick )


回复

使用道具 举报

117

主题

1237

帖子

6592

积分

六级会员

Rank: 9Rank: 9Rank: 9

积分
6592
发表于 2011-11-19 01:29:16 | 显示全部楼层

string.html库 就是调用了大量的替换 var rep = ..string.replace; 这个应该能降低消耗

string.html库 就是调用了大量的替换
var rep = ..string.replace;
这个应该能降低消耗
我是菜鸟...
回复

使用道具 举报

40

主题

143

帖子

936

积分

三级会员

Rank: 4

积分
936
 楼主| 发表于 2011-11-19 13:16:09 | 显示全部楼层

搞了个测试。 [color=#0000ff]var[/color][color=#000000] str=[/color][color=#800000]""

搞了个测试。
var str=""
var strcount=1000
for(i=1;strcount;1){
    str +=
"字符串"
}

io.open();
io.print(
"开始测试")

t1=time.tick()
var replacecount=1000
for(i=1;replacecount;1){
    str=string.replace(str,
"字符串","字符串")
   
sleep(0)
}
t2=time.tick()
io.print(
"测试1完成,用时:",t2-t1)
//strcount=10,replacecount=10000  测试次数5,测试结果time=30,cpu=20%瞬间
//strcount=100,replacecount=10000  测试次数5,测试结果time=210,cpu=30%瞬间
//strcount=1000,replacecount=10000  测试次数5,测试结果time=1900,cpu=50%瞬间
//strcount=10000,replacecount=10000  测试次数5,测试结果time=18860,cpu=50%持续
//strcount=100000,replacecount=10000  测试次数1,测试结果:机子相当的卡,结果弹出对话框:内存不足。

//strcount=1000,replacecount=100 测试次数5, 测试结果time=30,cpu=20%瞬间
//strcount=1000,replacecount=1000 测试次数5, 测试结果time=200,cpu=25%瞬间
//strcount=1000,replacecount=10000  测试次数5,测试结果time=1900,cpu=50%瞬间
//strcount=1000,replacecount=100000  测试次数5,测试结果time=19000,cpu=50%持续
//strcount=1000,replacecount=1000000  测试次数1,测试结果time=183406,cpu=50%持续
以上结果cpu是在任务管理器中观察的。
以上结果是测试多次后取的大概值。
以上结果仅代表在本人的电脑下的测试结果,不代表和其他人有相同的结果。
以上结果仅说明一个问题,那就是替换的时间和cpu的使用率随着替换字符串和替换次数的增加而增加。
回复

使用道具 举报

5

主题

442

帖子

2420

积分

五级会员

Rank: 8Rank: 8

积分
2420
发表于 2011-11-19 13:26:10 | 显示全部楼层

难道你认为替换次数越多,CPU的占用率应当越小? 花费的时间也越少? 在这些问题上浪费时间值得吗? 这跟吃了饭,又不想给钱有什么区别。

难道你认为替换次数越多,CPU的占用率应当越小? 花费的时间也越少?
在这些问题上浪费时间值得吗? 这跟吃了饭,又不想给钱有什么区别。
回复

使用道具 举报

30

主题

695

帖子

4178

积分

超级版主

Rank: 8Rank: 8

积分
4178
发表于 2011-11-19 13:33:03 | 显示全部楼层

aardio中的模式匹配要比传统的正则表达式快近百倍, 如果你觉得速度还不够快,那就优化你的代码,aardio不可能凭空的把你的电脑变成超级计算机。

aardio中的模式匹配要比传统的正则表达式快近百倍,
如果你觉得速度还不够快,那就优化你的代码,aardio不可能凭空的把你的电脑变成超级计算机。
回复

使用道具 举报

52

主题

1340

帖子

7326

积分

荣誉会员

Rank: 8Rank: 8

积分
7326
发表于 2011-11-19 21:40:26 | 显示全部楼层

事实证明 鱼和熊掌就不能兼得 很多东西必须有取舍

事实证明 鱼和熊掌就不能兼得
很多东西必须有取舍
回复

使用道具 举报

48

主题

593

帖子

3336

积分

五级会员

Rank: 8Rank: 8

积分
3336
发表于 2012-5-22 15:59:13 | 显示全部楼层

{:3_59:}测试了一下楼主的代码 两个时间差距确实巨大,部分代码段应该还是可以帖出来的。

测试了一下楼主的代码 两个时间差距确实巨大,部分代码段应该还是可以帖出来的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2019-11-15 09:12 , Processed in 0.078125 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表