none
请各位帮忙看一下下面这段程序,如何将这段生成数据文件的程序所消耗的时间优化呢?目前所花费的时间为40s,能不能在优化一些,尽量优化到20s,有什么方法吗?求指教 RRS feed

  • 问题

  • public Form1()
            {
                InitializeComponent();
                Stopwatch sw = new Stopwatch();
                sw.Start();
                //string filePath = @"D:\cp.bin";
                string filePath = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"cp.bin";//设置路径
                
               using (FileStream fs = File.Create(filePath))//优化
               {
                    /*需要使用内置的 Syncronized TextReader/Writer类
                     * 在复制内存时检测到可能的 I/O 争用条件。默认情况下,I/O 包不是线程安全的。
                     * 在多线程应用程序中,必须以线程安全方式(如 TextReader 或 TextWriter 的 Synchronized 方法返回的线程安全包装)访问流。
                     * 这也适用于 StreamWriter 和 StreamReader 这样的类。
                     */
                    StreamWriter ObjWrites = default(StreamWriter);
                    ObjWrites = new StreamWriter(fs);
                    dynamic synws = StreamWriter.Synchronized(ObjWrites);
    
                    double t0 = 0, f0 = 100000;
                    //double beta = (f1 - f0) / t1;
                    double beta = 900000/4.194304;
                    double chirp = 0;
                    Parallel.For(0, 167772160, (i) =>
                    {
                        t0 += 0.000000025;
                        chirp = Math.Cos(Math.PI * (2 * f0 + beta * t0) * t0);
                        chirp = Math.Round(chirp * 2046);
                        chirp = chirp*2 + 2046;
                        synws.Write(chirp.ToString());
                    });
                    synws.Close();
                    ObjWrites.Close();
                }
                sw.Stop();
                MessageBox.Show("耗时为:  " + sw.ElapsedMilliseconds.ToString() + "  ms");
            }

    2017年10月11日 7:41

全部回复

  • 从代码中看出有许多类型转化,考虑这样使用double类型

    double t0 = 0, f0 = 100000d;

    double beta = 900000d/4.194304d;

    double d = 10000d;

    如性能没有改善,把double改成decimal看是否有改善

    decimal d = 12.30m;

    若还不满足需求,考虑用ANTS performance profiler等工具profile代码,看是那里的程序消耗性能,再贴出来分析是否有优化方法。


    专注于.NET ERP/CRM开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2017年10月12日 0:57
  • 

    这是性能检测得出的结果,大部分时间都花在了写的部分,但不知如何解决,请问有什么方法可以快速的写文件吗?谢谢


    2017年10月12日 2:22
  •  public Form1()
            {
                InitializeComponent();
                Stopwatch sw = new Stopwatch();
                sw.Start();
                //string filePath = @"D:\cp.bin";
                string filePath = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"cp.bin";//设置路径将文件保存在目标文件下
                
               using (FileStream fs = File.Create(filePath))//优化
               {
                    /*需要使用内置的 Syncronized TextReader/Writer类
                     * 在复制内存时检测到可能的 I/O 争用条件。默认情况下,I/O 包不是线程安全的。
                     * 在多线程应用程序中,必须以线程安全方式(如 TextReader 或 TextWriter 的 Synchronized 方法返回的线程安全包装)访问流。
                     * 这也适用于 StreamWriter 和 StreamReader 这样的类。
                     */
                    StreamWriter ObjWrites = default(StreamWriter);
                    ObjWrites = new StreamWriter(fs);
                    dynamic synws = StreamWriter.Synchronized(ObjWrites);
    
                    double t0 = 0, f0 = 100000d;
                    //double beta = (f1 - f0) / t1;
                    double beta = 900000d/4.194304d;
                    double chirp = 0;
                    Parallel.For(0, 167772160, (i) =>
                    {
                        t0 += 0.000000025;
                        chirp = Math.Cos(Math.PI * (2 * f0 + beta * t0) * t0);
                        chirp = Math.Round(chirp * 2046);
                        chirp = chirp*2 + 2046;
                        synws.Write(chirp.ToString());//时间大都花在写文件上了,需要优化
                    });
                    synws.Close();
                    ObjWrites.Close();
                }
                sw.Stop();
                MessageBox.Show("耗时为:  " + sw.ElapsedMilliseconds.ToString() + "  ms");
            }

    以上是我的代码,经过性能检测,时间花费情况如下

    请问怎么做才能提高效率呢?谢谢,文件映射可以用在此处吗?急等大家的解答,谢谢


    2017年10月12日 9:02
  • 求助大神帮我看看问题出在哪儿了?性能测试我已经贴出来了,在线急等,谢谢
    2017年10月13日 2:22
  • 使用task。run()

    please verify my account

    2017年10月13日 5:21
  • 使用缓冲或者使用filewrite

    please verify my account

    2017年10月13日 5:23
  • Hi,

    感谢在MSDN论坛发帖。

    根据MSDN的规则,请不要重复发相同的帖子。

    https://social.msdn.microsoft.com/Forums/zh-CN/72ed9c68-4940-4f0d-8b3c-1834da20a6ca/40s20s?forum=2212

    我将会把这俩个帖子合并到一起去。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年10月13日 8:50
    版主
  • 具体该如何做呢?我是初学者,请指教
    2017年10月14日 7:11
  • 可以帮忙解决这个问题吗?我是C#初学者,请指教,谢谢
    2017年10月14日 7:13
  • Hi,

    这种算法优化的问题,已经超出该论坛的范围了,根据MSDN的规则,我将把这个帖子移到一般性讨论论坛。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年10月17日 6:35
    版主