为什么系统调用消耗更多时间?

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jubincn/article/details/6989716

参考:《Understanding Unix/Linux Programming: A Guide to Theory and Practice》之2.7


        用户进程位于用户空间,内核进程位于系统空间,磁盘只能被内核直接访问。

        在运行内核代码时,CPU工作在管理员模式,这对应于一些特殊的堆栈和内存环境,必须在系统调用时切换到这个环境中。系统调用结束后,CPU要切换到用户模式,又要将堆栈和内存环境恢复到用户模式的状态,这种内存环境的切换要耗费很多时间。

        因此,系统调用所耗费的时间主要在两次环境切换上,如果用户程序中普通代码和系统调用交替出现,那么将产生很大的环境切换的开销。

展开阅读全文

关于hash_map的时间消耗问题

04-11

写了个程序,有两个步骤rna、遍历某个文件夹中的所有文件,通过对这些文件进行md5取值,保存到输出文件中。rnb、当这个文件夹中的某一个文件被修改了,那么输出出来这个文件的文件名、原来的md5值和新的md5值rnrn看这个图:rn[img=https://img-bbs.csdn.net/upload/201404/11/1397205967_367691.jpg][/img]rnrnrnrn这些都是进行的是md5匹配操作,也就是上面描述的第二步rna、左上图使用的方式是:rn 首先得到文件中的md5值(上面描述的第一步)保存到一个hash_map中,每次在对文件夹中的一个文件进行求md5值的时候,遍历这个hash_map,先匹配文件路径(包含文件名),再匹配md5的值,发现不一样,输出出来,发现一样的,break;rnrnb、右上图使用的方式是:rn 首先得到文件中的md5值(上面描述的第一步)保存到一个hash_map中,再重新对现在的这个文件夹中的所有文件进行md5取值,输出到临时文件中,再从这个文件中读取数据,保存到另一个hash_map中,最后对两个hash_map中的数据进行匹配。rnrnc、左下图rn 是b方式的空转rnrnd、右下图rn 使用b方式时候总的消耗时间是148782ms,但是光是消耗在两个hash_map的时间就是144384ms了。rn这是两个hash_map中的匹配操作:rn[code=c]rnvoid TraversalOperator_impl::Md5Match()rnrn // 先从md5_match_tmp_file.txt文件中获取到临时的md5值,存放到current_hash_info_中rn GetAllFileMd5ValueFromFile(current_hash_info_, MD5_MATCH_TMP_FILE);rn // 再去和file_hash_info_中的数据进行比较rn hash_map::iterator it_file_hash_info_;rn hash_map::iterator it_current_hash_info_;rn for (it_current_hash_info_ = current_hash_info_.begin(); it_current_hash_info_ != current_hash_info_.end(); it_current_hash_info_++)rn rn for (it_file_hash_info_ = file_hash_info_.begin(); it_file_hash_info_ != file_hash_info_.end(); it_file_hash_info_++)rn rn // 找到keyrn if (!it_file_hash_info_->first.compare(it_current_hash_info_->first))rn rn // 匹配valuern if (!it_file_hash_info_->second.compare(it_current_hash_info_->second))rn rn break;rn rn elsern rn cout << it_current_hash_info_->first << " original md5 value is : " << it_file_hash_info_->second;rn cout << " ============== new md5 value is : " << it_current_hash_info_->second << endl;rn cout << endl;rn rn break;rn rn rn rnrn[/code]rnrnrnrn通过网上资料得知,消耗的时候主要是在begin()中rn讨论一下,这要怎么改,速度能更快?换成方式1?或者有更好的?rnrnrn弱弱的感觉,鸡肋就出在这个匹配上面,无论是1和2都是消耗的罪魁祸首。 论坛

为什么这段代码,会消耗我大量时间(5分钟以上)??

02-03

为什么这段代码,会消耗我大量时间(5分钟以上)??处量的记录总共约15000条,ACCESS 数据库,这些表都已建立自增量的字段主键。rnrnrn'开始导入数据rnrn CopyRowItem = DatasetInput.Tables("Code").Rowsrn For NN = 0 To CopyRowItem.Count - 1rn CopyRow = DataSetBBzt.Tables("Rep_code").NewRow()rn CopyRow("bytYear") = InputYearrn CopyRow("strCodeID") = CopyRowItem(NN).Item("strCodeID")rn CopyRow("strCodeName") = CopyRowItem(NN).Item("strCodeName")rn CopyRow("blnDepartment") = CopyRowItem(NN).Item("blnDepartment")rn CopyRow("blnEnd") = CopyRowItem(NN).Item("blnEnd")rn CopyRow("bytGrade") = CopyRowItem(NN).Item("bytGrade")rn CopyRow("bytClass") = CopyRowItem(NN).Item("bytClass")rn CopyRow("blnD_C") = CopyRowItem(NN).Item("blnD_C")rn CopyRow("strMeasure") = CopyRowItem(NN).Item("strMeasure")rn CopyRow("blnChange") = CopyRowItem(NN).Item("blnChange")rn CopyRow("blnChild") = CopyRowItem(NN).Item("blnChild")rn CopyRow("blnZero") = CopyRowItem(NN).Item("blnZero")rn CopyRow("sngDepre") = CopyRowItem(NN).Item("sngDepre")rn CopyRow("mnRemark") = CopyRowItem(NN).Item("mnRemark")rn DataSetBBzt.Tables("Rep_code").Rows.Add(CopyRow)rn Nextrnrnrn CopyRowItem = DatasetInput.Tables("Gledger").Rowsrn For NN = 0 To CopyRowItem.Count - 1rn CopyRow = DataSetBBzt.Tables("Rep_gledger").NewRow()rn CopyRow("bytYear") = InputYearrn CopyRow("bytPeriod") = CopyRowItem(NN).Item("bytPeriod")rn CopyRow("strCodeID") = CopyRowItem(NN).Item("strCodeID")rn CopyRow("strBeginDirection") = CopyRowItem(NN).Item("strBeginDirection")rn CopyRow("dblBeginBalance") = CopyRowItem(NN).Item("dblBeginBalance")rn CopyRow("dblDebit") = CopyRowItem(NN).Item("dblDebit")rn CopyRow("dblCredit") = CopyRowItem(NN).Item("dblCredit")rn CopyRow("strEndDirection") = CopyRowItem(NN).Item("strEndDirection")rn CopyRow("dblEndBalance") = CopyRowItem(NN).Item("dblEndBalance")rn CopyRow("dblBeginBalanceCount") = CopyRowItem(NN).Item("dblBeginBalanceCount")rn CopyRow("dblDebitCount") = CopyRowItem(NN).Item("dblDebitCount")rn CopyRow("dblCreditCount") = CopyRowItem(NN).Item("dblCreditCount")rn CopyRow("dblEndBalanceCount") = CopyRowItem(NN).Item("dblEndBalanceCount")rn DataSetBBzt.Tables("Rep_gledger").Rows.Add(CopyRow)rn Nextrnrn WaitClear(Me)rn'保存数据rn WaitWindow(Me, "正在保存财务数据,请稍等...")rn Tryrn OleDbDataAdapterRep_code.Update(DataSetBBzt, "Rep_code")rn OleDbDataAdapterRep_gledger.Update(DataSetBBzt, "Rep_gledger")rn MsgBox("已正确导入帐套资料!", MsgBoxStyle.Information, "提示信息")rn Catch ex As Exceptionrn MsgBox(ex.Message, MsgBoxStyle.Information, "导入失败")rn Finallyrn End Try 论坛

没有更多推荐了,返回首页