- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我意识到这离微优化领域太远了,但我很想知道为什么调用 DateTime.Now 和 DateTime.UtcNow 如此“昂贵”。我有一个示例程序,它运行几个场景来做一些“工作”(添加到一个计数器)并尝试这样做 1 秒钟。我有几种方法可以让它在有限的时间内完成工作。这些示例表明 DateTime.Now 和 DateTime.UtcNow 比 Environment.TickCount 慢得多,但即使这样也比让一个单独的线程休眠 1 秒然后设置一个值以指示工作线程停止相比慢。
所以我的问题是:
请原谅这个例子的冗长:
class Program
{
private static volatile bool done = false;
private static volatile int doneInt = 0;
private static UInt64 doneLong = 0;
private static ManualResetEvent readyEvent = new ManualResetEvent(false);
static void Main(string[] args)
{
MethodA_PrecalcEndTime();
MethodB_CalcEndTimeEachTime();
MethodC_PrecalcEndTimeUsingUtcNow();
MethodD_EnvironmentTickCount();
MethodX_SeperateThreadBool();
MethodY_SeperateThreadInt();
MethodZ_SeperateThreadLong();
Console.WriteLine("Done...");
Console.ReadLine();
}
private static void MethodA_PrecalcEndTime()
{
int cnt = 0;
var doneTime = DateTime.Now.AddSeconds(1);
var startDT = DateTime.Now;
while (DateTime.Now <= doneTime)
{
cnt++;
}
var endDT = DateTime.Now;
Console.WriteLine("Time Taken: {0,30} Total Counted: {1,20}", endDT.Subtract(startDT), cnt);
}
private static void MethodB_CalcEndTimeEachTime()
{
int cnt = 0;
var startDT = DateTime.Now;
while (DateTime.Now <= startDT.AddSeconds(1))
{
cnt++;
}
var endDT = DateTime.Now;
Console.WriteLine("Time Taken: {0,30} Total Counted: {1,20}", endDT.Subtract(startDT), cnt);
}
private static void MethodC_PrecalcEndTimeUsingUtcNow()
{
int cnt = 0;
var doneTime = DateTime.UtcNow.AddSeconds(1);
var startDT = DateTime.Now;
while (DateTime.UtcNow <= doneTime)
{
cnt++;
}
var endDT = DateTime.Now;
Console.WriteLine("Time Taken: {0,30} Total Counted: {1,20}", endDT.Subtract(startDT), cnt);
}
private static void MethodD_EnvironmentTickCount()
{
int cnt = 0;
int doneTick = Environment.TickCount + 1000; // <-- should be sane near where the counter clocks...
var startDT = DateTime.Now;
while (Environment.TickCount <= doneTick)
{
cnt++;
}
var endDT = DateTime.Now;
Console.WriteLine("Time Taken: {0,30} Total Counted: {1,20}", endDT.Subtract(startDT), cnt);
}
private static void MethodX_SeperateThreadBool()
{
readyEvent.Reset();
Thread counter = new Thread(CountBool);
Thread waiter = new Thread(WaitBool);
counter.Start();
waiter.Start();
waiter.Join();
counter.Join();
}
private static void CountBool()
{
int cnt = 0;
readyEvent.WaitOne();
var startDT = DateTime.Now;
while (!done)
{
cnt++;
}
var endDT = DateTime.Now;
Console.WriteLine("Time Taken: {0,30} Total Counted: {1,20}", endDT.Subtract(startDT), cnt);
}
private static void WaitBool()
{
readyEvent.Set();
Thread.Sleep(TimeSpan.FromSeconds(1));
done = true;
}
private static void MethodY_SeperateThreadInt()
{
readyEvent.Reset();
Thread counter = new Thread(CountInt);
Thread waiter = new Thread(WaitInt);
counter.Start();
waiter.Start();
waiter.Join();
counter.Join();
}
private static void CountInt()
{
int cnt = 0;
readyEvent.WaitOne();
var startDT = DateTime.Now;
while (doneInt<1)
{
cnt++;
}
var endDT = DateTime.Now;
Console.WriteLine("Time Taken: {0,30} Total Counted: {1,20}", endDT.Subtract(startDT), cnt);
}
private static void WaitInt()
{
readyEvent.Set();
Thread.Sleep(TimeSpan.FromSeconds(1));
doneInt = 1;
}
private static void MethodZ_SeperateThreadLong()
{
readyEvent.Reset();
Thread counter = new Thread(CountLong);
Thread waiter = new Thread(WaitLong);
counter.Start();
waiter.Start();
waiter.Join();
counter.Join();
}
private static void CountLong()
{
int cnt = 0;
readyEvent.WaitOne();
var startDT = DateTime.Now;
while (doneLong < 1)
{
cnt++;
}
var endDT = DateTime.Now;
Console.WriteLine("Time Taken: {0,30} Total Counted: {1,20}", endDT.Subtract(startDT), cnt);
}
private static void WaitLong()
{
readyEvent.Set();
Thread.Sleep(TimeSpan.FromSeconds(1));
doneLong = 1;
}
}
最佳答案
TickCount
只是读取一个不断增加的计数器。这几乎是您可以做的最简单的事情。
DateTime.UtcNow
需要查询系统时间 - 不要忘记虽然 TickCount
对用户更改时钟或 NTP 之类的事情一无所知, UtcNow
必须考虑到这一点。
现在您已经表达了性能问题 - 但在您给出的示例中,您所做的只是递增计数器。我希望在您的真实 代码中,您将做更多的工作。如果您正在做大量 的工作,这可能会使 UtcNow
所花费的时间相形见绌。在做任何其他事情之前,您应该对其进行衡量,以确定您是否真的在尝试解决一个不存在的问题。
如果您确实需要改进,那么:
关于c# - 为什么 DateTime.Now DateTime.UtcNow 如此缓慢/昂贵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4075525/
我有一个通过 REST 调用 WEB API 的客户端应用程序。出于管理原因,我想节省相应步骤的时间,看起来像这样: var requestStartTime = DateTime.UtcNow; r
我需要将一些代码从静态调用 DateTime.UtcNow 升级为调用基本上返回 DateTimeOffset.UtcNow 的时间提供程序服务。要进一步将此 DateTimeOffset 实例转换为
EF 查询中的 DateTime 函数是否由 SQL Server 计算,就像查询表达式之外的 DateTime 函数由运行 IL 的计算机计算一样? 我有一个包含 SalesOrders 的应用程序
我几年前写过这个系统,现在不写任何 C#,所以这对我来说有点生疏。我使用下面显示的代码写出一条新记录。由于某些原因,@TStamp 有时没有正确写出(SQL Server 12): 可以看出,我有时会
我无法理解这个问题。 假设 unixtime 是自 1970.1.1 以来的总秒数,为什么 datetime.utcnow().timestamp() 返回不同的数字? >>> from dateti
我将使用 UtcNow 值作为 Azure 上复合键的一部分。我想将日期/时间转换为对人类和计算机都友好的东西。像这样的:2016021416512345 => 2016/02/14 4:51:23
我有一个从客户那里收到的 TimeZone,我用它来设置过期日期时间,这样它就相当于客户时区中“月末”的 UTC。 我试过这个: var current = timezone.ToUniversalT
我遇到了一个很难解决的问题,这是 DateTime.UtcNow 的结果。在我的本地机器上打印时它给了我正确的时间,但在我的服务器上它提前了 3 小时。这就是我在 Razor View 中打印的方式:
假设我在单个方法中对 DateTime.UtcNow 的两次调用之间有一个很长的简单数学循环。 DateTime.UtcNow 是否会在同一方法中返回两个不同的值,如果中间的代码花费的时间超过系统的计
我有一个 dll,它使用此代码以 UTC 格式记录日期时间,即`DateTime.UtcNow() 我正在运行一个控制台应用程序,该应用程序在两个不同的服务器中使用此 dll。一台服务器在“复活节时区
我的代码并没有什么特别之处。这基本上就是我所关心的。 节点.cs public class Node { public string Name { get; set; } public
在解决代码中的问题时,我已经签约构建我遇到了 DateTime.UtcNow 似乎不一致的结果。在我写这篇文章时,时间似乎在 1/19/2017 7:3x 和 1/20/2017 3:2x 之间波动。
这个(LINQPad 片段): DateTime.Now.ToString("yyyy-MM-ddTHH:mm:sszzz").Dump(); DateTime.UtcNow.ToString("yy
datetime.utcnow() 此调用返回的日期时间不正确,比 UTC/GMT 延迟 1 小时(登记:http://www.worldtimeserver.com/current_time_in_
我有以下内容: from datetime import datetime def get_report_month_key(): month_for_report = datetime.ut
我有一些具有 CreatedDate 和/或 UpdatedDate 属性的模型,在我的播种中,我将它们设置为 DateTime.UtcNow。 new TestModel() { Id =
这个问题在这里已经有了答案: How Can I Automatically Populate SQLAlchemy Database Fields? (Flask-SQLAlchemy) (2 个回
我在资源标签中使用 utcNow(),但我没有获取日期和时间,而是再次获取“[utcNow()]”。以下是我使用 Arm 模板的格式。 ARM 模板参数: "resourceTags": {
如何在 ADF 中将动态内容 utcnow() 格式化为“2021-06-01 13:42:59”之类的内容。我尝试过“yyyy-MM-dd HH:mm:ss”,但不起作用。 最佳答案 正如 @Joe
如何在 ADF 中将动态内容 utcnow() 格式化为“2021-06-01 13:42:59”之类的内容。我尝试过“yyyy-MM-dd HH:mm:ss”,但不起作用。 最佳答案 正如 @Joe
我是一名优秀的程序员,十分优秀!