【发布时间】:2017-03-15 11:56:59
【问题描述】:
我即将完成这些计算,所以我想为什么我不使用子字符串,然后我又想它会不会很慢......
我记得一位大学老师教过一些旧的基于 delphy 的图形引擎,告诉我们尝试使用 plus 而不是乘法计算,因为与乘法实现相比它真的很慢。所以数学的本质应该是很快的,但是使用了这么多的乘法和除法......
所以我虽然来这里问你...
有些人在他的网络服务中使用整数作为日期时间,我想把它分成一个模型...... 正如我所说我想写 .toString 但后来我虽然它可能很慢,所以我虽然我会先搜索,在没有看到我想问你之后,但后来我意识到我必须先写它才能问问题...
下面是示例代码:
StartDate = Pc.ToDateTime(
value/10000,
(value - (value/10000)*10000)/100,
value - ((value/10000)*10000) - (((value - (value/10000)*10000)/100)*100),
0,
0,
0,
0
);
诗句
Pc.ToDateTime(
Convert.ToInt32(value.ToString().SubString(0,4)),
Convert.ToInt32(value.ToString().SubString(4,2)),
Convert.ToInt32(value.ToString().SubString(6,2)),
0,
0,
0,
0
);
编辑 Pc => 私有静态只读 PersianCalendar Pc = new PersianCalendar();
编辑 2
正如@Yeldar Kurmangaliyev 所说,我将我的第一个代码更改为:
StartDate = Pc.ToDateTime(
value/10000,
value%10000/100,
value%100,
0,
0,
0,
0
);
编辑 3
正如你所建议的,我使用了一种方法来衡量我自己的表现。 这里我使用秒表:
&Edit 4:我添加了 Ivan Stoev 示例代码:
public ActionResult PerformanceMeasure()
{
PersianCalendar pc = new PersianCalendar();
var first = 0L;
var second = 0L;
var third = 0L;
var forth = 0L;
var value = 13950812;
Stopwatch sw = new Stopwatch();
sw.Reset();
sw.Start();
pc.ToDateTime(
value / 10000,
(value - (value / 10000) * 10000) / 100,
value - ((value / 10000) * 10000) - (((value - (value / 10000) * 10000) / 100) * 100),
0,
0,
0,
0
);
sw.Stop();
first = sw.ElapsedTicks;
sw.Reset();
sw.Reset();
sw.Start();
pc.ToDateTime(
value / 10000,
value % 10000 / 100,
value % 100,
0,
0,
0,
0
);
sw.Stop();
second = sw.ElapsedTicks;
sw.Reset();
sw.Reset();
sw.Start();
pc.ToDateTime(
Convert.ToInt32(value.ToString().Substring(0, 4)),
Convert.ToInt32(value.ToString().Substring(4, 2)),
Convert.ToInt32(value.ToString().Substring(6, 2)),
0,
0,
0,
0
);
sw.Stop();
third = sw.ElapsedTicks;
sw.Reset();
sw.Reset();
sw.Start();
int month, day;
int year = Math.DivRem(Math.DivRem(value, 100, out day), 100, out month);
pc.ToDateTime(
year,
month,
day,
0,
0,
0,
0);
sw.Stop();
forth = sw.ElapsedTicks;
sw.Reset();
var ms = new { First = first, Second = second, Third = third, Forth = forth };
return Json(ms, JsonRequestBehavior.AllowGet);
}
这是多次运行的结果
RUN 1:{"First":70,"Second":41,"Third":52,"Forth":42}
RUN 2:{"First":64,"Second":37,"Third":44,"Forth":37}
RUN 3:{"First":81,"Second":45,"Third":70,"Forth":47}
RUN 4:{"First":63,"Second":37,"Third":44,"Forth":38}
RUN 5:{"First":68,"Second":37,"Third":45,"Forth":37}
RUN 6:{"First":65,"Second":37,"Third":46,"Forth":38}
RUN 7:{"First":76,"Second":41,"Third":51,"Forth":41}
RUN 8:{"First":62,"Second":37,"Third":47,"Forth":37}
RUN 9:{"First":57,"Second":37,"Third":45,"Forth":37}
RUN 0:{"First":62,"Second":37,"Third":45,"Forth":38}
让我补充一下,当我更紧密更快地运行它时,就像在我开始将每次运行复制粘贴到这里之前一样,第四次更快第二次,但并非一直如此,似乎一旦进行了计算,将被缓存一小段时间。顺便说一句,差异仍然没有那么大。
【问题讨论】:
-
我投票决定将此问题作为题外话结束,因为您可以自己检查而不是问什么更快
-
你的意思是
DateTime.ParseExact(value.ToString(), "yyyyMMdd", CultureInfo.InvariantCulture)? -
你没听说过
DateTime.Parse()吗? -
还有,你明白
value - ((value / 10000) * 10000) - (((value - (value / 10000) * 10000) / 100) * 100)其实就是value % 100这么简单吗?这个表达式(value - (value/10000)*10000)/100b> 也可以重写为(value / 10000) % 100。
标签: c# performance numbers substring