当前位置:编程学习 > C#/ASP.NET >>

C#程序优化

小弟用C#写了一个程序,老大嫌速度慢,让优化一下。本人接触C#不久,请各位大佬给点优化意见(VS2005,单线程,不涉及多线程的操作)。 --------------------编程问答-------------------- 使用一个性能分析工具(VS2010自带,2005需要另外安装),看看程序的热点在哪里。

所谓热点,就是调用次数最多,耗时比例最高的函数。
然后对热点进行优化。 --------------------编程问答-------------------- 如果是代码优化的话 可以贴出代码一起讨论一下 --------------------编程问答--------------------
引用 1 楼 caozhy 的回复:
使用一个性能分析工具(VS2010自带,2005需要另外安装),看看程序的热点在哪里。

所谓热点,就是调用次数最多,耗时比例最高的函数。
然后对热点进行优化。

热点知道,就是想知道一些vs中的优化技巧。例如在vc++2003中开启/G7可以使用SSE2优化,使用一维数组比二维数组快这些优化技巧。 --------------------编程问答--------------------
引用 2 楼 aiguo0713 的回复:
如果是代码优化的话 可以贴出代码一起讨论一下

程序虽然不复杂,但是功能函数多,不好贴啊 --------------------编程问答--------------------
引用 3 楼 fyjin99 的回复:
引用 1 楼 caozhy 的回复:

使用一个性能分析工具(VS2010自带,2005需要另外安装),看看程序的热点在哪里。

所谓热点,就是调用次数最多,耗时比例最高的函数。
然后对热点进行优化。

热点知道,就是想知道一些vs中的优化技巧。例如在vc++2003中开启/G7可以使用SSE2优化,使用一维数组比二维数组快这些优化技巧。


你要贴出代码。
另外你可能需要不断尝试各种组合来找到最佳的方案。 --------------------编程问答-------------------- CLR会自动产生为特定平台优化的代码,包括特定指令集的优化。

另外考虑使用C# 4.0,将程序并行化。实践表明,在一个4核心电脑上,这样做很容易提高2~3倍的速度。 --------------------编程问答--------------------
引用 6 楼 caozhy 的回复:
CLR会自动产生为特定平台优化的代码,包括特定指令集的优化。

另外考虑使用C# 4.0,将程序并行化。实践表明,在一个4核心电脑上,这样做很容易提高2~3倍的速度。

能不能详细点?C# 4.0不知道啊 --------------------编程问答--------------------
引用 7 楼 fyjin99 的回复:
引用 6 楼 caozhy 的回复:

CLR会自动产生为特定平台优化的代码,包括特定指令集的优化。

另外考虑使用C# 4.0,将程序并行化。实践表明,在一个4核心电脑上,这样做很容易提高2~3倍的速度。

能不能详细点?C# 4.0不知道啊

金旭亮老师有一些入门的文章,你可以Google之。 --------------------编程问答-------------------- 沒有多線程的話,一般會是代碼問題,代碼的冗餘,以及一些變量的使用,數據庫的操作等等,都會造成執行效率降低。 我之前也優化一個小program,主要從佔用內存(考慮一些變量的使用,有些變量是不合適的),以及logic 方面去著手優化,重新整理logic。還有既然你都用工具找到熱點了  那就更好優化了。重新看看自己的代碼吧! --------------------编程问答-------------------- 楼主可以吧代码 发出来看下~~~ --------------------编程问答-------------------- 不用的资源及时释放掉~
推荐用using~ --------------------编程问答-------------------- 因为涉及到的程序代码很多,我就选一个贴一下吧
  for(int rpara=lowr;rpara<=topr;rpara++)
{
       for(int cpara=lowc;cpara<=topc;cpara++)
{
               if (T2[cpara, rpara] > max) max = T2[cpara, rpara];
                 if (T2[cpara, rpara] < min) min = T2[cpara, rpara];
 }
 }
例如这段该怎么优化? --------------------编程问答--------------------
引用 12 楼 fyjin99 的回复:
因为涉及到的程序代码很多,我就选一个贴一下吧
  for(int rpara=lowr;rpara<=topr;rpara++)
{
  for(int cpara=lowc;cpara<=topc;cpara++)
{
  if (T2[cpara, rpara] > max) max = T2[cpara, rpara];
  if (T2[cpara, rpara] < min)……

这种代码最适合并行。 --------------------编程问答-------------------- 怎么并行? --------------------编程问答--------------------
引用 1 楼 caozhy 的回复:
使用一个性能分析工具(VS2010自带,2005需要另外安装),看看程序的热点在哪里。

所谓热点,就是调用次数最多,耗时比例最高的函数。
然后对热点进行优化。

可以参考,这个思路对的! --------------------编程问答--------------------
引用 13 楼 caozhy 的回复:
这种代码最适合并行。

如何并行?? --------------------编程问答-------------------- 1.使用EQATEC软件加壳
2.运行夹克后的程序,运行到慢的地方,立刻退吹
3.根据生成的xml查看每个函数的调用次数,执行时间,平均时间。找到消耗时间最多的。尝试优化。

优化没有通用方法,具体问题具体分析。 --------------------编程问答-------------------- 搜索:
EQATECProfiler
EQATECTracer --------------------编程问答-------------------- 现在是热点能找到但是优化不了啊 --------------------编程问答--------------------   for(int rpara=lowr;rpara<=topr;rpara++)
{
  for(int cpara=lowc;cpara<=topc;cpara++)
{
  if (T2[cpara, rpara] > max) max = T2[cpara, rpara];
  if (T2[cpara, rpara] < min) min = T2[cpara, rpara];
}
 }
这段代码我通过两个线程来执行,一个计算max,一个计算min在双核的cpu上是不是理论上能提高近50%? --------------------编程问答-------------------- 如果要经常这样做。你不如创建索引,或是考虑更换个数据结构,每次添加时候记录下最大最小,以后添加时候只要对比最大最小就知道是否添加的比最大的大,比最小的小。可以减少循环次数。如果经常这样嵌套循环肯定不行的。 --------------------编程问答--------------------
引用 21 楼 wuyazhe 的回复:
如果要经常这样做。你不如创建索引,或是考虑更换个数据结构,每次添加时候记录下最大最小,以后添加时候只要对比最大最小就知道是否添加的比最大的大,比最小的小。可以减少循环次数。如果经常这样嵌套循环肯定不行的。

这个是对T2的局部数据进行窗口操作,每次添加时候记录下最大最小肯定是不行的。 --------------------编程问答-------------------- 小弟还处于写代码阶段  学习 --------------------编程问答--------------------
引用 22 楼 fyjin99 的回复:
引用 21 楼 wuyazhe 的回复:

如果要经常这样做。你不如创建索引,或是考虑更换个数据结构,每次添加时候记录下最大最小,以后添加时候只要对比最大最小就知道是否添加的比最大的大,比最小的小。可以减少循环次数。如果经常这样嵌套循环肯定不行的。

这个是对T2的局部数据进行窗口操作,每次添加时候记录下最大最小肯定是不行的。


既然没可能优化就不优化,找别的可优化的地方,实际情况给领导反映。 --------------------编程问答-------------------- 好多大牛啊,学习 --------------------编程问答-------------------- int tmpValue = T[..,..];
max = Math.Max(tmpValue,max);
min = Math.Min(tmpValue.min); --------------------编程问答-------------------- T2 是什么类型 --------------------编程问答--------------------
引用 27 楼 wuxing2006 的回复:
T2 是什么类型

T2是byte[,]类型 --------------------编程问答-------------------- for(int rpara=lowr;rpara<=topr;rpara++)
{
  for(int cpara=lowc;cpara<=topc;cpara++)
{
  if (T2[cpara, rpara] > max) max = T2[cpara, rpara];
  if (T2[cpara, rpara] < min) min = T2[cpara, rpara];
}
 }
这段代码能否通过多线程来加速? --------------------编程问答--------------------
引用 29 楼 fyjin99 的回复:
for(int rpara=lowr;rpara<=topr;rpara++)
{
  for(int cpara=lowc;cpara<=topc;cpara++)
{
  if (T2[cpara, rpara] > max) max = T2[cpara, rpara];
  if (T2[cpara, rpara] < min) min = T2[cpara, rpara];
……


这样的代码,如果单cpu,多线程反而会更慢,多核的cpu,只要替换一行即可
System.Threading.Tasks.Parallel.For(lowr,topr,rpara)
{
    for (int cpara = lowc; cpara <= topc; cpara++)
    {
        if (T2[cpara, rpara] > max) max = T2[cpara, rpara];
        if (T2[cpara, rpara] < min) min = T2[cpara, rpara];
    }
}
--------------------编程问答--------------------
引用 30 楼 wuyazhe 的回复:
引用 29 楼 fyjin99 的回复:
for(int rpara=lowr;rpara<=topr;rpara++)
{
for(int cpara=lowc;cpara<=topc;cpara++)
{
if (T2[cpara, rpara] > max) max = T2[cpara, rpara];
if (T2[cpara, rpara] < min) min = T2[……

补充下,如果内侧循环过小,外侧循环次数过多,最好在外面再包装一层,手工拆分下。否则可能反而性能降低。这些关键你要实际去做。

金旭亮老师有一些入门的文章,都介绍了。 --------------------编程问答-------------------- System.Threading.Tasks.Parallel.For(lowr,topr,rpara)
{
    for (int cpara = lowc; cpara <= topc; cpara++)
    {
        if (T2[cpara, rpara] > max) max = T2[cpara, rpara];
        if (T2[cpara, rpara] < min) min = T2[cpara, rpara];
    }
}
这种简单处理好像多核也是比单核花费时间吧 --------------------编程问答-------------------- 看了金旭亮老师的文章好像并行处理对这种简单的加加减减反而会费时,并行处理该在什么地方优化? --------------------编程问答-------------------- 那么VS2008 呢?谁知道
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,