gpt4 book ai didi

c# - c# 编译器如何处理此 DateTime.ToOADate()?

转载 作者:太空宇宙 更新时间:2023-11-03 19:28:30 25 4
gpt4 key购买 nike

我需要有非常高性能的循环遍历大型数据集。我需要比较时间戳,但我的日期是 OA 格式:

if (md.DT_OA > new DateTime(2011, 3, 13).ToOADate()) 

编译器会在每个循环周期中评估 new DateTime(2011, 3, 13).ToOADate() 吗?或者“优化器”会在一开始就解决这个问题。

也就是说,我可以偷懒并在代码中加入这个吗?

如您所知 - 我不太了解编译器的工作原理...

编辑 1

评论启发了我做一个适当的测试:

下面的选项 2 比选项 1 快 3%。令人惊讶的是,速度并没有快多少——编译器似乎非常聪明,或者日期创建速度很快。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Test1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
Go();
}

public static void Go()
{
int c = 0;
DateTime st = DateTime.Now;
DateTime dt = new DateTime(2011, 3, 13);
for (int i = 0; i < 1000000; i++)
{
if (DateTime.Now > new DateTime(2011, 3, 13)) // Option 1
//if (DateTime.Now > dt) // Option 2
{
c++;
}
}

MessageBox.Show("Time taken: " + DateTime.Now.Subtract(st).TotalMilliseconds + " c: " + c);
}
}
}

最佳答案

我看不出它会优化那个……很确定它不会(我知道它不会在 IL 层优化它,但这并没有说明任何关于JIT;但我真的不认为它会 - 它不知道该方法每次总是返回相同的东西).

相反,如果您关心它,请将其从循环中移除:

var oaDate = new DateTime(2011, 3, 13).ToOADate();
...loop...
if (md.DT_OA > oaDate) {...}

只是new DateTime(int,int,int)(评论);让我们创建一个测试程序:

    static void Main()
{
for (int i = 0; i < 1000; i++)
{
if (DateTime.Now > new DateTime(2011, 3, 13)) Console.WriteLine("abc");
}
}

如果我们编译它然后反汇编 IL(反射器/ildasm/等),我们得到:

L_0000: ldc.i4.0 
L_0001: stloc.0
L_0002: br.s L_002b
L_0004: call valuetype [mscorlib]System.DateTime [mscorlib]System.DateTime::get_Now()
L_0009: ldc.i4 0x7db
L_000e: ldc.i4.3
L_000f: ldc.i4.s 13
L_0011: newobj instance void [mscorlib]System.DateTime::.ctor(int32, int32, int32)
L_0016: call bool [mscorlib]System.DateTime::op_GreaterThan(valuetype [mscorlib]System.DateTime, valuetype [mscorlib]System.DateTime)
L_001b: brfalse.s L_0027
L_001d: ldstr "abc"
L_0022: call void [mscorlib]System.Console::WriteLine(string)
L_0027: ldloc.0
L_0028: ldc.i4.1
L_0029: add
L_002a: stloc.0
L_002b: ldloc.0
L_002c: ldc.i4 0x3e8
L_0031: blt.s L_0004
L_0033: ret

查看 L_0009 到 L_0011 - 即创建新日期时间 每次循环迭代(L_0031: blt.s L_0004 是循环重复).正如我所料,编译器对您的请求非常直白。

关于c# - c# 编译器如何处理此 DateTime.ToOADate()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6743200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com