我正在尝试确定删除字符串的方法是最快的.
我只是得到开始和结束时间并显示差异.
但结果是如此多变,例如如下所示,相同的方法可以从60毫秒到231毫秒.
获得更准确结果的更好方法是什么?
替代文字http://www.deviantsart.com/upload/1q4t3rl.png
using System;
using System.Collections;
using System.Collections.Generic;
namespace TestRemoveFast
{
class Program
{
static void Main(string[] args)
{
for (int j = 0; j < 10; j++)
{
string newone = "";
List<string> tests = new List<string>();
for (int i = 0; i < 100000; i++)
{
tests.Add("{http://company.com/Services/Types}ModifiedAt");
}
DateTime start = DateTime.Now;
foreach (var test in tests)
{
//newone = ((System.Xml.Linq.XName)"{http://company.com/Services/Types}ModifiedAt").LocalName;
newone = Clean(test);
}
Console.WriteLine(newone);
DateTime …Run Code Online (Sandbox Code Playgroud) 我有一个循环运行的代码,它根据当前时间保存状态.有时这可能只相差几毫秒,但由于某些原因,似乎DateTime.Now将始终返回至少10 ms的值,即使它仅在2或3 ms之后.这是一个主要问题,因为我保存的状态取决于它保存的时间(例如录制内容)
我的测试代码返回10 ms的每个值:
public static void Main()
{
var dt1 = DateTime.Now;
System.Threading.Thread.Sleep(2);
var dt2 = DateTime.Now;
// On my machine the values will be at least 10 ms apart
Console.WriteLine("First: {0}, Second: {1}", dt1.Millisecond, dt2.Millisecond);
}
Run Code Online (Sandbox Code Playgroud)
是否有另一种解决方案可以获得精确的当前时间到毫秒?
有人建议看秒表类.虽然秒表类是非常准确的,但它并没有告诉我当前的时间,我需要的东西是为了保存程序的状态.
以下是配置文件.
<formatters>
<add template="{timestamp} {severity} {category} {message}" type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=4.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
name="SingleLineFormatter" />
</formatters>
Run Code Online (Sandbox Code Playgroud)
哪个显示
31/05/2011 11:43:24信息......
但是没有毫秒显示哪些对于穿孔仪器有用,谁知道如何显示?谢谢.
(忽略优化的编译器标志)
是不是这个代码会进入某些系统的块?
if (Datetime.Now!=Datetime.Now)
{
...
}
Run Code Online (Sandbox Code Playgroud)
我的意思是,它如何评估这里的价值观?(按顺序)?
有什么情况可能是真的吗?
再次,忽略优化标志.
当计算两个DateTime对象之间的毫秒差异时,我似乎总是得到一个返回的数字,其中数字的小数部分与数字的整数分量相同.例如:1235.1235
为什么会这样?难道我做错了什么?这是语言的怪癖还是DateTime粒度的限制或其他什么?
这可以使用以下代码演示:
DateTime then = DateTime.Now;
Thread.Sleep(1234);
DateTime now = DateTime.Now;
TimeSpan taken = now - then;
string result = taken.TotalMilliseconds.ToString(CultureInfo.InvariantCulture);
//result = "1235.1235"
Run Code Online (Sandbox Code Playgroud)
由CodesInChaos评论:
DateTime`不准确到这个精度级别:参见C#DateTime.Now precision
但是 - 这并不能解释这种行为.
我知道它DateTime.UtcNow没有相对较高的精度(10-15 ms分辨率).
这对我来说是一个问题,因为在我的日志文件中,我想要更好的解决方案来解决竞争条件.
问题是:如何以比DateTime.UtcNow提供的更精确的方式获得当前日期/时间?
到目前为止,我见过的唯一解决方案是:https://stackoverflow.com/a/15008836/270348.这是解决问题的合适方法吗?
可能的重复:
C# DateTime.Now 精度
关于 .NET 中的高分辨率计时,有一些关于 SO 的问题,其中声明(如 MSDN 文档中所述)DateTime.Ticks 的结果为 100 纳秒。
但在现实生活中似乎完全不是这样。如果我运行下面的代码,我希望它生成行,其中每一行的 Tick 值都不同,其中很多行具有相同的毫秒值。但事实并非如此 - 滴答值保持不变,直到下一次毫秒值的变化,不会增加时间戳的分辨率。
private static List<string> GetTimeLine(long iterations)
{
List<string> liste = new List<string>();
for (long i = 0; i <= iterations; i++)
{
liste.Add(DateTime.Now.Millisecond.ToString() + " - " + DateTime.Now.Ticks.ToString());
}
return liste;
}
static void Main(string[] args)
{
Console.WriteLine("Generating timeline");
guids = GetTimeLine(10000);
File.WriteAllLines(@"C:\Test\GUIDS.TXT", guids);
Console.WriteLine("File written - Press ENTER");
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
结果输出示例:
...
867 - 634940160118679615867 - 634940160118679615
867 - …
Thread.Sleep()确保DateTime.Now不同的最短时间是多少?
鉴于DateTime具有Ticks属性,您可以认为以下内容就足够了:
Thread.Sleep(TimeSpan.FromTicks(1));
Run Code Online (Sandbox Code Playgroud)
这样可以,但是这可以保证后续调用DateTime.Now不相等?
更新:出现DateTime精度是硬件相关的,所以我将使用以下方法:
public static void SleepUntilDateTimeChanges()
{
DateTime now = DateTime.Now;
while(now == DateTime.Now)
Thread.Sleep(TimeSpan.FromMilliseconds(1));
}
Run Code Online (Sandbox Code Playgroud) 我有一个用C#,VS 2005编写的程序。它具有记录数据和时间戳的功能。我需要毫秒级的时间分辨率,因为数据采样周期时间可能为 50 毫秒或更短。我使用DateTime.Now.Millisecond来检索系统时间,但我发现在某些计算机上,两个时间戳之间的实际间隔不是50ms而是62-63ms。
所以我简化了我的代码并在几台计算机上进行了尝试,代码如下:
static void Main(string[] args)
{
while (true)
{
Thread.Sleep(50);
Console.WriteLine("{0}", DateTime.Now.Millisecond);
}
}
Run Code Online (Sandbox Code Playgroud)
这是 Win7 SP1 上的结果:
928 991 53 116 178 240 306 368 431 493 555 618 ...
请注意,间隔约为 62-63ms。
我知道Windows NT系列操作系统的时间分辨率约为16ms,所以我对结果并不感到非常惊讶。
但是,问题是,当我在其他一些 Win7(SP1) 计算机上测试相同的程序时,结果是准确的,并且间隔几乎总是 50ms,我不知道为什么行为差异如此之大。
所以,我的问题是:
顺便提一句,
1)我在Win10上测试,间隔约为50-51ms。
2)我尝试使用秒表,但没有效果。
3)Environment.TickCount也不准确。
4)我尝试使用VS 2015,结果相同。
=========================================
这是我的新测试代码:
static void Main(string[] args)
{
long ticks = DateTime.Now.Ticks;
int tEV = Environment.TickCount;
while (true)
{
Thread.Sleep(50);
Console.WriteLine("{0}, {1}, {2}",
DateTime.Now.Ticks - ticks,
DateTime.Now.Millisecond,
Environment.TickCount - …Run Code Online (Sandbox Code Playgroud) 我正在为一个应用程序实现一些诊断,用户可以看到图形更新的速度,我遇到了一些看似奇怪的行为.我的图形更新功能是使用Timer调用的,它看起来像这样:
private void RefreshScreen(object sender, EventArgs e)
{
DateTime begin = DateTime.Now;
// Do some updating...
DateTime end = DateTime.Now;
graphicsUpdateRate = (end - begin).TotalMilliseconds;
}
Run Code Online (Sandbox Code Playgroud)
当我稍后在另一个函数中将graphicsUpdateRate显示到一个单独的窗口时,它几乎总是为0.偶尔它实际上会是~0.5,但我从未在低于0.48的情况下看到它.有什么理由为什么如果它低于这个会将它钳制到0?使用TimeSpan.TotalMilliseconds时有什么我想念的吗?我对此感到困惑,因为它似乎是随机的.
c# ×10
datetime ×5
.net ×3
app-config ×1
logging ×1
performance ×1
real-time ×1
timespan ×1
wpf ×1
xna ×1