分析一个文本文件(英文)中各个词出现的频率,并使用vs2012的performance analysis tool分析

       上一篇博客还是很久以前的了,虽然博客也是很好的学习方式,但比较懒~这次是老师的要求的作业,恩,废话少说了。

一、程序说明及结果

     采用的是c++编写的代码,对于读取的单词采用的双向链表的结构存储(方便对节点排序),由于要输出频率最高的十个单词,就意味着要对链表排序。在实现上,我是在每读入一个单词时并对链表的序列进行更新,将复杂度控制在了O(n)。

程序结果(其中文本文件大小为259KB):


二、performance analysis tool分析结果


1、分析结果,可以看出运行时间约为6秒钟,以及各个时段的cpu使用率。



2、下面再仔细的看看每个部分所花的时间,在上图的“当前视图"右边可以往下拉,找到函数一项,点击:




3、分析具体的函数的每一部分消耗,如Wordcount::redFile():




并可定位至相应代码:


三、源码


1、头文件

#ifndef HEAD_H
#define HEAD_H

#include<string>
#include<iostream>
#include<fstream>

using namespace std;

//用于存储读入单词的链表结构
struct Word{
	int count;
	string w;
	Word * next;
	Word * par;
};

class Wordcount{
private:
	Word * ptr;
public:
	Wordcount();
	~Wordcount(){};
	void readFile();
	void reaultOut();
	void update(Word * pn);
};
#endif

2、实现文件

#include "head.h"

Wordcount::Wordcount(){
	ptr = NULL;
}

void Wordcount::readFile(){
	ifstream in;
	in.open("data.txt", ios::in);

	if (!in)
		return;

	string str = "";
	Word * p, *pre;
	char ch;

	while (!in.eof()){
		in.get(ch);
		if (ch == ' ' || ch == 10)
			continue;

		if (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z'))
		{
			while (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')){
				if ('A' <= ch && ch <= 'Z')
					ch += 32;
				str += ch;
				if (!in.eof())
					in.get(ch);
				else
					return;
			}
			///
			//一个单词结束
			Word * wtemp = new Word;;
			wtemp->count = 1;
			wtemp->w = str;
			wtemp->next = NULL;
			wtemp->par = NULL;
			str = "";
			//若为第一个单词
			if (ptr == NULL){
				ptr = wtemp;
			}
			else{
				//与前面的单词比较
				p = pre = ptr;
				while (p){
					pre = p;
					if (p->w == wtemp->w){
						p->count++;
						//更新链表
						update(p);
						break;
					}
					else
						p = p->next;
				}
				//当前单词不存在时
				if (!p){
					pre->next = wtemp;
					wtemp->par = pre;
				}
			}
		}
	}
	in.close();
}

//更新链表的排序
void Wordcount::update(Word * pn){
	Word * p = NULL;
	Word * q = NULL;
	if (pn != ptr)
	while ((pn->par != NULL) && (pn->count > pn->par->count)){
		//如果与头结点交换,需更新ptr指针,即头指针
		if (pn->par == ptr)
			ptr = pn;
		p = pn->next;
		q = pn->par;
		///注意双链表共有6个节点需要更新
		//更新当前节点的下一节点的par指针,注意判断其是否为空
		if (pn->next)
			pn->next->par = pn->par;
		pn->next = pn->par;
		pn->par = pn->par->par;
		if (q->par)
			q->par->next = pn;
		q->par = pn;///
		q->next = p;
	}

}

void Wordcount::reaultOut(){
	int i;
	Word * p = ptr;
	if (p != NULL){
		for (i = 0; i < 10 && p; i++){
			cout << p->w << "  " << p->count << endl;
			p = p->next;
		}
	}
}
#include "head.h"

void main()
{
	Wordcount test;
	test.readFile();
	test.reaultOut();
}

四、总结

     首先学习了一个新的代码分析工具,这只算是了解了,希望以后多加使用探索,使真正能改进程序性能。
     代码还有很多可以改进的地方,也肯定会有很多的bug,不吝赐教!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值