C VS C++????

ming6424 2005-10-25 03:09:03
前不久和同事一起写了一个处理字典资料的程序,要读入一个程序,处理后输出一个新的

同事用C写的,将原文件读了2遍
(fopen,fread,fwrite,fseek,fclose),只用了str相关的函数
最后的程序大小 160KB 耗时 310-320之间
而且源代码也很小

我用C++写的,只读了原文件一遍,用了个两个Vector存储字典的资料,一个Vector存储字母索引的信息,其他用了string
最后的程序大小 572KB,耗时在3200左右
我的代码也很大

郁闷啊!!!
...全文
156 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ming6424 2005-10-26
  • 打赏
  • 举报
回复
long lPos = BASE_ADDRESS + m_iCount * sizeof(int);
int iCount = 0;

m_outFile<<FILE_HEADER;//一些信息

m_outFile.write((const char *)&m_iCount, sizeof(int));//单词数量

for (vector<int>::iterator vi = m_vecIndex.begin(); vi != m_vecIndex.end(); vi++)
{
m_outFile.write((const char*)vi, sizeof(int) / 2);
}
for (int i = 0; i < m_iCount; i++)
{
m_outFile.write((const char*)&lPos, sizeof(int));
}


for (vector<string>::iterator vi1 = m_vecEnglish.begin(), vi2 = m_vecChinese.begin(); vi1 != m_vecEnglish.end(); vi1++, vi2++)
{
string strBuffer;
strBuffer = *vi1;
int iLength;

// 写英文
m_outFile.seekp(0, ios::seekdir::end);
iLength = strBuffer.length();
m_outFile.write((const char *)&iLength, sizeof(unsigned char));
m_outFile<<strBuffer.c_str();
lPos += sizeof(unsigned char) + strBuffer.length();

// 写中文
strBuffer = *vi2;
iLength = strBuffer.length();
m_outFile.write((const char *)&iLength, sizeof(unsigned char));
m_outFile<<strBuffer.c_str();
lPos += sizeof(unsigned char) + strBuffer.length();

iCount++;

// 修改英文每个单词的实际地址
if (iCount > 0 && iCount < m_iCount)
{
m_outFile.seekp(BASE_ADDRESS + iCount * sizeof(int), ios::seekdir::beg);
m_outFile.write((const char *)&lPos, sizeof(int));
m_outFile.seekp(0, ios::seekdir::end);
}
}
xqk 2005-10-26
  • 打赏
  • 举报
回复
那就用C的标准函数库写呗,当然比C++快了
Atry 2005-10-25
  • 打赏
  • 举报
回复
读文件应该不是问题所在,你看看你输出的部分的代码
ming6424 2005-10-25
  • 打赏
  • 举报
回复
To:Atry() ( )

不过说实话,的确应该采用内存映射文件的!
Atry 2005-10-25
  • 打赏
  • 举报
回复
哦,对不起我搞错了你的文件的格式了,你这样的文件,肯定是fstream要比fread快,那么看来不是读取的问题,是写入的问题了
ming6424 2005-10-25
  • 打赏
  • 举报
回复
To:Atry() ( )

我只能说,对你说的,我不知所云,不知道你看明白要求没有???
不明白哪里来的索引,哪里来的查找?
我每次用fstream读一行,应该不算随机访问吧?
只是最后写的时候,要根据后面的内容去修改前面的,用到了seekp

输入文件类似于下面的:
aei一,任一,每一,某一
Aei<名>英文字母第1个,A音,第一己知数,甲等,优等
a drop in the ocean沧海一粟
a few几个
a few minutes几分钟
a good deal of许多的
a kind of同一类
a large extend十分
a large number of多数的
a little少量的,些许地
Abdias哹`dai噑<名>希伯来的先知
abdicate`哹dikeit<动>舍弃,放弃,退位,退职,辞职,律废嫡
abdication弳bdi`kei刵<名>放弃
abdicator`哹di弅eit?<名>放弃者
abdomen`哹d噈en<可>下腹
abdominal哹`d塵inl<形>腹部的
Featured 2005-10-25
  • 打赏
  • 举报
回复
就读写文件比较而已,用C写能有160KB?

20KB足矣!!

Atry 2005-10-25
  • 打赏
  • 举报
回复
正确的做法,读一遍索引读到内存,然后再查找。
本来用fstream有缓存,应该比fread快,但是你基本上都是随机访问,fstream的缓存没啥用。应该自己来做缓存,如果文件不大,干脆一次性全读入内存。
string和Vector你使用不当虽然会导致频繁分配小内存,但是我认为这不会是主要原因,内存里面操作malloc有内存池,虽然比静态内存慢,也不会慢好多。关键问题还是出在IO上,你输出或者输入的地方肯定有问题
Atry 2005-10-25
  • 打赏
  • 举报
回复
你和你同事做的都很傻,不过你更傻
pomelowu 2005-10-25
  • 打赏
  • 举报
回复
C++的效率本来就不如C,没什么好郁闷的。优化一下程序,能得到差不多的效率。
ming6424 2005-10-25
  • 打赏
  • 举报
回复
资料为每行一个单词,一个中文解释

我们输出的都要输出
单词个数,每个字母开始的单词的索引,每个单词在文件中的位置
4字节 26* 2字节 单词个数*4字节
然后依次为(重复单词个数次)
英文单词长度 1字节
英文单词 英文单词长度个字节
中文解释长度 1字节
中文解释 中文解释长度个字节

同事读两遍,第一遍确定单词个数和每个字母开始的索引
第二遍才去进行具体的处理

至于采用vector的问题,是因为开始并不知道单词的个数
goodboyws 2005-10-25
  • 打赏
  • 举报
回复
不要用Vector,这种动态数组效率一般比较低(因为要不断地内存重分配),而且估计你用法也不太合适
i_noname 2005-10-25
  • 打赏
  • 举报
回复
算法不同没法比较。
接分

1,649

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 非技术类
社区管理员
  • 非技术类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧