朋友们,帮我优化一下这几行代码,我已经晕了【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分,可怜啊。。。


...全文
148 15 打赏 收藏 举报
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复

#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

1.6w+

社区成员

VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
帖子事件
创建了帖子
2010-07-12 07:13
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……