朋友们,帮我优化一下这几行代码,我已经晕了【VC】

a21999 2010-07-12 07:13:22
今天很郁闷,折腾了一天,也没想出来如何改进,性能还是那么低下。。。

#include "time.h"
#include "iostream"
using namespace std;

int main()
{
string s= "";
for(int i = 0; i < 1000; i ++)
{
s+="00011001110000010";
}
char ch = '1';
clock_t start,finish;
int size = s.size();

start = clock();
for (int i=0;i < size;i++)
{
for (int n = i;(char)s[i] == ch; n++)
if ((char)s[n] != ch)
{
if(n < size)
{
if(n == i+1)
cout<<i+1<<endl;
if(n != i +1)
cout<<i+1<<'-'<<n<<endl;
i=n;
}
}
}

finish = clock();
cout<<"字符串长度: "<<size<<endl;
cout<<"耗时: "<<finish - start<<"毫秒"<<endl;
return 0;

}


现在,处理17000长度的字符串,耗时在2000毫秒左右,如何能提高性能呢?

希望各路高手不吝赐教。。。

不知道为什么,只能悬赏100分,可怜啊。。。


...全文
138 点赞 收藏 15
写回复
15 条回复
切换为时间正序
请发表友善的回复…
发表回复

#include <stdio.h>

#define SIZE 17000
#define N (SIZE-1)

int main(void)
{
register v0 = 16, v1 = 10;

puts("4-5\n8-10\n16");

while( v0 < N )
{
printf("%d-%d\n", (v0 += 5), (v1 += 12));
printf("%d-%d\n", (v0 += 4), (v1 += 5));
printf("%d\n", (v0 += 8));
}

return 0;
}
回复
a21999 2010-07-13
(←大海無量→神功↑) 做的很好了,谢谢。结贴给分。
回复
昨夜无风 2010-07-12
耗时不是算法的问题,是你输出占用了时间。你可以把cout去掉看看计算的时间,另外,5楼的用printf代替了cout节约了时间,换成cout也是一样的耗时!!



#include "time.h"
#include "iostream"
using namespace std;

int main()
{
string s= "";
for(int i = 0; i < 1000; i ++)
{
s+="00011001110000010";
}
char ch = '1';
clock_t start,finish;
int size = s.size();

start = clock();
int n = -1;
bool bRecord = false;
for ( i=0;i < size;i++)
{
if((char)s[i] != ch)
{
if(!bRecord)
{
if(i == n+1)
{
cout<<n+1<<endl;
}
else
{
cout<<n+1<<'-'<<i<<endl;
}
bRecord = true;
}
continue;
}
if(bRecord)
{
n = i;
bRecord = false;
} }

finish = clock();
cout<<"字符串长度: "<<size<<endl;
cout<<"耗时: "<<finish - start<<"毫秒"<<endl;
return 0;

}

回复
BlueMap 2010-07-12
确实没看出来干嘛用。
回复

#include "time.h"
#include "iostream"
using namespace std;

int main()
{
string s= "";
for(int i = 0; i < 1000; i ++)
{
s+="00011001110000010";
}
int n;
int ch = '1';
clock_t start,finish;
int size = s.size();
string buf;
char sTmp[32];

start = clock();
for(i = 0; i < size; ++i)
{
for(n = i; s[i] == ch; ++n)
{
if (n < size && s[n] != ch)
{
if(n == ++i)
{
sprintf(sTmp, "%d\n", i);
}
else
{
sprintf(sTmp, "%d-%d\n", i, n);
}
buf += sTmp;
i=n;
}
}
}

finish = clock();

puts(buf.c_str());

cout<<"字符串长度: "<<size<<endl;
cout<<"耗时: "<<finish - start<<"毫秒"<<endl;

return 0;
}
回复
[Quote=引用 6 楼 chenjianju 的回复:]

你的90%时间基本都花在了屏幕输出上了,console的滚屏幕效率是很低的。
[/Quote]
时间基本都花在了屏幕输出上了
回复
[Quote=引用 8 楼 wangli820 的回复:]

for(n = i; s[i] == ch; ++n)
这段代码好像意义不大吧
[/Quote]

我也不知道这代码是做什么用的,就不乱动它了。
回复
wangli820 2010-07-12
for(n = i; s[i] == ch; ++n)
这段代码好像意义不大吧
回复
a21999 2010-07-12
(←大海無量→神功改的不错,已经能提升到420毫秒左右了,还能更快吗?

回复
chenjianju 2010-07-12
你的90%时间基本都花在了屏幕输出上了,console的滚屏幕效率是很低的。
回复

#include "time.h"
#include "iostream"
using namespace std;

int main()
{
string s= "";
for(int i = 0; i < 1000; i ++)
{
s+="00011001110000010";
}
int n;
int ch = '1';
clock_t start,finish;
int size = s.size();

start = clock();
for(i = 0; i < size; ++i)
{
for(n = i; s[i] == ch; ++n)
{
if (n < size && s[n] != ch)
{
if(n == ++i)
{
printf("%d\n", i);
}
else
{
printf("%d-%d\n", i, n);
}
i=n;
}
}
}

finish = clock();
cout<<"字符串长度: "<<size<<endl;
cout<<"耗时: "<<finish - start<<"毫秒"<<endl;
return 0;
}
回复
雪影 2010-07-12
你的程序是想做什么?
两个for循环遍历字符串数组目的是啥?
回复
adamwyb 2010-07-12
最好描述下你程序要达到什么功能
回复
using namespace System;
using namespace System::Text;

int main()
{
// Create a StringBuilder that expects to hold 50 characters.
// Initialize the StringBuilder with "ABC".
StringBuilder^ sb = gcnew StringBuilder("ABC", 50);


用vc.net的话 不如用stringbuilder优化一下效率
回复
xumaojun 2010-07-12
分析一下数据特点s中都是重复的“00011001110000010”,所以下面的循环长度可以改为“00011001110000010”,就可以优化了
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告
暂无公告