多线程性能问题求解

haigegee1988 2015-01-15 05:06:56
项目在windows平台用WPF(C#)开发的,项目中需要用到多线程,其中一个线程是实时绘图线程,要求绘图平滑,因此实时性要求较高,另一个线程做其他处理每秒一次,两个线程之间不存在共用资源的问题。
现在问题是,每秒中做其他处理的线程在每秒执行时,会影响到实时绘图线程,是绘图出现卡顿现象。。
开始以为是做其他工作的线程很耗时,影响到绘图线程,于是做了一下测试,测试如下:
将每秒做其他工作的线程直接改为while(true),程序启动开始该线程,让其一直做处理,奇怪问题出现了。。
测试1:

while(true)
{
Random random = new Random();
double lfTest = random.NextDouble();
double lfResult = Math.Sin(lfTest*10);
}

测试2:
m_nCount为全局变量,初始化为0

while(true)
{
m_nCount++
m_nCount = m_nCount % 10000000;
double lfResult = Math.Sin(m_nCount );
}

问题是测试1中的代码不会使绘图线程绘图出现卡顿情况,而测试2中的代码会使绘图出现卡顿情况,为什么啊?这个测试线程不是一直在执行吗,与里面执行的代码有很大关系?影响其他线程是怎么影响的?
...全文
560 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sinat_26014465 2015-12-29
  • 打赏
  • 举报
回复
while(true) { sleep(10);//j加上试试 ,,,,,,,,,, }
於黾 2015-01-16
  • 打赏
  • 举报
回复
循环里加个sleep不行吗,非要死循环吗
winnowc 2015-01-16
  • 打赏
  • 举报
回复
要说这两个测试的区别,测试一在循环里面new Random();会导致GC回收,它对CPU的使用效率比测试二低。如果把这个new Random();放到循环外面,两个的使用率就一样了。 一是系统资源有限;二是操作系统的调度不可能完美;三是虽然自己没有用公共资源,不代表底层不存在公共资源。所以线程是可能会影响到其它线程的效率的。影响的方式很多,比如windows线程有动态优先级,它可能会认为你的定时任务线程更重要,提高了它的优先级,就可能影响真正重要的绘图线程。 简单点可以先提高绘图线程的优先级试试。
ajaxfeifei 2015-01-16
  • 打赏
  • 举报
回复
引用 3 楼 haigegee1988 的回复:
引用 1 楼 lc2737 的回复:
测试2一开始就很卡?还是说到后面才卡?
一开始就会影响另外一个线程的
在测试2中改成


    m_nCount = 1000;
    double lfResult = Math.Sin(m_nCount );
试试,会卡吗
haigegee1988 2015-01-15
  • 打赏
  • 举报
回复
引用 1 楼 lc2737 的回复:
测试2一开始就很卡?还是说到后面才卡?
一开始就会影响另外一个线程的
bdmh 2015-01-15
  • 打赏
  • 举报
回复
看代码应该不是问题
ajaxfeifei 2015-01-15
  • 打赏
  • 举报
回复
测试2一开始就很卡?还是说到后面才卡?
MSC.Software SimXpert* 是一种全面集成的模拟环境,用于进行多学科分析。SimXpert 能够提供交互式图形界面,有助于工程师执行端到端模拟工作,包括本机计算机辅助设计 (CAD) 导入 (import)、预处理、模型设置、求解、后期处理和报告。英特尔和 MSC.Software 合作线程化了 SimXpert,大幅提升了工具的性能和大幅提高了用户的工作效率。英特尔® TBB 由于能够兼容用 C++ 编写的多平台应用 SimXpert,当选为最佳方法。SimXpert 的许多特性超出了典型高性能计算 (HPC) 的纯数字应用,这些特性包括复杂的含有几何数据和模拟结果的数据库风格操作、复杂的内存分配运算、对广泛的企业级基础设施 C++ 代码的依赖、适合英特尔® TBB 管道并行模式的整体可视化管道架构,以及 OpenGL* 渲染。英特尔® TBB 采用增量式线程化方法,始自对初始的 72 项关键工程操作进行线程化,紧接着对用于生成边缘图物理基元的代码实施了线程化。在两路 (2S) 英特尔® 至强® 处理器 5100 系列平台(四核)上对七个较大的客户模拟模型的测试,显示出工程计算性能提升 3.8 倍至 3.9 倍。针对边缘图的优化使速度提升了 3% 到 44%。展望未来,MSC.Software 将继续采用这种增量式线程化方法,接下来将对其余绘图类型实施线程化,并可能在未来通过实施英特尔® TBB 管道实现重叠处理和 I/O。

7,540

社区成员

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

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