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

Gif*_*guy 11 .net c# math performance modulo

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

这段代码每秒运行数千次,我更倾向于避免使用手动循环计算 - 不惜一切代价.

两个TimeSpans之间的模数的想法可能看起来有点奇怪,所以请允许我解释 -
假设我们有
TimeSpan A = 1分30秒
SecondSpan B = 20秒

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

A + B =(TimeSpan)1分50秒

A - B =(TimeSpan)1分10秒

A*B =没有合理的计算方法
我们应该能够将TimeSpan乘以整数.A*5 =(TimeSpan)7分30秒
微软没有在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有什么想法吗?

Jon*_*eet 26

乘法很容易:

TimeSpan a5 = TimeSpan.FromTicks(A.Ticks * 5);
Run Code Online (Sandbox Code Playgroud)

同样A/B:

double aOverB = (double)A.Ticks / B.Ticks;
Run Code Online (Sandbox Code Playgroud)

和A%B:

TimeSpan aModB = TimeSpan.FromTicks(A.Ticks % B.Ticks);
Run Code Online (Sandbox Code Playgroud)

示范:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

00:07:30
4.5
00:00:10
Run Code Online (Sandbox Code Playgroud)

  • TimeSpan是一个结构,因此不会烧毁GC. (6认同)

Mic*_*urr 5

会是这样的

new TimeSpan( A.Ticks % B.Ticks))
Run Code Online (Sandbox Code Playgroud)

给你想要的结果?Ticks会是做正确工作的合适单位吗?也许你需要将跨度转换为秒或毫秒或其他东西.我不知道你的申请是什么.