C# 计算指数延迟的估计时间

C# 计算指数延迟的估计时间,c#,time,exponential,C#,Time,Exponential,奇怪的是,我编写了一个小程序,将一个空格写入一个文本文件,然后是2个空格,然后是4个空格,等等。我记录了每个循环执行此操作所需的时间,当然它会明显地扩展。虽然刚开始时只有0.003秒,但它很快就到达了分线。现在我想计算程序完成的预计时间 这是我目前使用的代码: //This creates the file if it doesn't exist File.AppendAllText("C:/1G.txt", ""); //I am starting w

奇怪的是,我编写了一个小程序,将一个空格写入一个文本文件,然后是2个空格,然后是4个空格,等等。我记录了每个循环执行此操作所需的时间,当然它会明显地扩展。虽然刚开始时只有0.003秒,但它很快就到达了分线。现在我想计算程序完成的预计时间

这是我目前使用的代码:

//This creates the file if it doesn't exist
File.AppendAllText("C:/1G.txt", "");

//I am starting with 30 iterations
for (int i = 0; i < 30; i++)
{
    DateTime start = DateTime.Now;
    
    //The 1<<i will loop 1, 2, 4, 8, etc. times
    for (int j = 0; j < 1 << i; j++)
    {
        File.AppendAllText("C:/1G.txt", " ");
    }

    DateTime end = DateTime.Now;

    Console.WriteLine($"i = {i}, 1<<i = {1 << i}, Time: {(end-start)}");
}

如何计算这种情况下的模糊估计时间?

您是否试图证明不良做法会影响代码性能?如果没有,并且您确实想首先测量执行时间,请尝试使用秒表测量时间(创建一次秒表,并在内部循环执行完成后重置)-测量持续时间比比较
DateTime要好得多。现在
s。接下来,通过使用
File.AppendAllText
可以在每次方法调用时打开和关闭文件流。实际上最好只打开一次流,写入所需的数据,然后再关闭一次。你能详细说明一下你到底想达到什么目标吗?因为我不太明白你一开始问的是什么。您所做的工作呈指数级增长,因此在您的实现中,时间也呈指数级增长。如果我没有弄错的话,您希望得到一次向文件写入空间的平均调用时间。为此,您必须补偿样本数量。我将通过以下方式实现它:

static void Main()
{
    var stopwatch = new Stopwatch();
    var samples = new double[30];

    for (var i = 0; i < 30; i++)
    {
        stopwatch.Start();

        // File.OpenWrite creates the file if it doesn't exist
        // Move these usings outside of the loop if you don't want to measure opening/closing stream to file
        using (var fileStream = File.OpenWrite("D:\\1G.txt"))
        using (var streamWriter = new StreamWriter(fileStream))
        {
            // Option A
            // This will create a string with desired number of spaces,
            // no internal loop necessary, but allocates a lot of memory
            streamWriter.Write(new string(' ', 1 << i));

            // Option B
            // If you insist on creating a loop
            //for (int j = 0; j < 1 << i; j++)
            //{
            //    streamWriter.Write(' ');
            //}
        }

        stopwatch.Stop();

        var writeDurationTimeSpan = TimeSpan.FromTicks(stopwatch.ElapsedTicks);
        var writeDurationInMs = writeDurationTimeSpan.TotalMilliseconds;
        var singleSpaceWriteDuratonInMs = writeDurationTimeSpan.TotalMilliseconds / (1 << i);

        samples[i] = singleSpaceWriteDuratonInMs;

        Console.WriteLine("i = {0}, 1<<i = {1}, Execution duration: {2} ms, Single space execution duration: {3} ms",
            i,
            1 << i,
            writeDurationInMs,
            singleSpaceWriteDuratonInMs.ToString("F20").TrimEnd('0')
        );

        stopwatch.Reset();
    }

    Console.WriteLine("Average single space invocation time: {0} ms",
        samples.Average().ToString("F20").TrimEnd('0')
    );
}
static void Main()
{
var stopwatch=新秒表();
var样本=新的双[30];
对于(变量i=0;i<30;i++)
{
秒表。开始();
//如果文件不存在,则File.OpenWrite将创建该文件
//如果不想测量文件的打开/关闭流,请将这些using移到循环之外
使用(var fileStream=File.OpenWrite(“D:\\1G.txt”))
使用(var streamWriter=newstreamwriter(fileStream))
{
//方案A
//这将创建一个包含所需空格数的字符串,
//不需要内部循环,但会分配大量内存

streamWriter.Write(新字符串(“”,1)您所说的“不是100%翻倍”是什么意思你知道double是一种浮点类型。为此执行任何数学运算都是不准确的。或者你的意思是2只是指数因子的粗略估计?没错。但我想知道是否有比仅仅将2作为因子更准确的计算方法。最后,我无法计算出r一个问题,每次迭代都比以前需要更长的时间。我不在乎我在atm文件中的写入方式,这实际上是一个很好的例子,因为记录的时间不像使用更干净的代码更新答案那样可预测,这是否回答了您的问题?还要记住,IO操作持续时间不同-很可能您会永远不要两次得到相同的结果。使用足够的调用只会让你发现一种趋势
static void Main()
{
    var stopwatch = new Stopwatch();
    var samples = new double[30];

    for (var i = 0; i < 30; i++)
    {
        stopwatch.Start();

        // File.OpenWrite creates the file if it doesn't exist
        // Move these usings outside of the loop if you don't want to measure opening/closing stream to file
        using (var fileStream = File.OpenWrite("D:\\1G.txt"))
        using (var streamWriter = new StreamWriter(fileStream))
        {
            // Option A
            // This will create a string with desired number of spaces,
            // no internal loop necessary, but allocates a lot of memory
            streamWriter.Write(new string(' ', 1 << i));

            // Option B
            // If you insist on creating a loop
            //for (int j = 0; j < 1 << i; j++)
            //{
            //    streamWriter.Write(' ');
            //}
        }

        stopwatch.Stop();

        var writeDurationTimeSpan = TimeSpan.FromTicks(stopwatch.ElapsedTicks);
        var writeDurationInMs = writeDurationTimeSpan.TotalMilliseconds;
        var singleSpaceWriteDuratonInMs = writeDurationTimeSpan.TotalMilliseconds / (1 << i);

        samples[i] = singleSpaceWriteDuratonInMs;

        Console.WriteLine("i = {0}, 1<<i = {1}, Execution duration: {2} ms, Single space execution duration: {3} ms",
            i,
            1 << i,
            writeDurationInMs,
            singleSpaceWriteDuratonInMs.ToString("F20").TrimEnd('0')
        );

        stopwatch.Reset();
    }

    Console.WriteLine("Average single space invocation time: {0} ms",
        samples.Average().ToString("F20").TrimEnd('0')
    );
}