c# - 如何在不循环的情况下使用 System.TimeSpan 值实现模数运算?

标签 c# .net performance math modulo

我在我的代码 (C#/WPF) 中对性能非常敏感的部分,我需要以最快的方式在两个 System.TimeSpan 值之间执行取模运算。

此代码每秒将运行数千次,我非常愿意不惜一切代价避免使用手动循环计算。

两个 TimeSpans 之间的模数的想法可能看起来有点奇怪,所以请允许我解释一下 -
说我们有
时间跨度 A = 1 分 30 秒
时间跨度 B = 20 秒

以下是常见操作及其合理结果的列表:

A + B = (TimeSpan)1 分 50 秒

A - B = (TimeSpan)1 分 10 秒

A * B = 没有合理的计算方法
我们应该能够将 TimeSpan 乘以一个整数。 A * 5 = (TimeSpan) 7 分 30 秒
Microsoft 尚未实现 TimeSpans 和整数之间的乘法。

A/B = (int)4 或 (double)4.5
此操作未直接在 .NET 框架中实现,但非常有意义。
A中有4.5个B。 (4.5 * 20 = 90)

A % B = (TimeSpan) 10 秒
给定合理的 TimeSpan 划分,TimeSpan 模数应该非常简单。
A/B 真的 等于 (int)4 余数 (TimeSpan)10 秒。商和余数是不同的数据类型,这实际上可能是微软没有直接实现它的原因。

我需要找到一种无需循环的有效方法来计算它。通常我不会反对短循环,但这些 TimeSpans 可能会有很大差异。 TimeSpans 之间的指数差异越大,商就越大。商越大,“分割循环”必须执行的迭代次数越多。这是我在我的应用程序的这一部分中不允许的依赖项。

SO 有什么想法吗?

最佳答案

乘法很简单:

TimeSpan a5 = TimeSpan.FromTicks(A.Ticks * 5);

同样是 A/B:

double aOverB = (double)A.Ticks / B.Ticks;

还有 A%B:

TimeSpan aModB = TimeSpan.FromTicks(A.Ticks % B.Ticks);

演示:

using System;

class Test
{
    static void Main()
    {
        TimeSpan a = TimeSpan.FromSeconds(90);
        TimeSpan b = TimeSpan.FromSeconds(20);

        TimeSpan a5 = TimeSpan.FromTicks(a.Ticks * 5);
        double aOverB = (double)a.Ticks / b.Ticks;
        TimeSpan aModB = TimeSpan.FromTicks(a.Ticks % b.Ticks);

        Console.WriteLine(a5);
        Console.WriteLine(aOverB);
        Console.WriteLine(aModB);
    }
}

输出:

00:07:30
4.5
00:00:10

关于c# - 如何在不循环的情况下使用 System.TimeSpan 值实现模数运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1295751/

相关文章:

c# - 为什么无法使用 C# 从 csv 文件中解码波斯语字符?

c# - Action 委托(delegate)、泛型、协变和逆变

.net - 反射还是动态方法?

.net - Resharper调试第三方反编译的dll

performance - 发送两个后续 HTTP 请求的最快方法是什么?

c# - 在服务器端 c# 打印 html 或 pdf

c# - 摆脱 C# 中的预编译器指令

c++ - 仿函数与模板参数

asp.net - 使用数据列表时如何更改表格布局?

python - Pandas 迭代更新列值