首页 > 解决方案 > 如何有效地找到 System.Numerics.Vector 中的值索引?

问题描述

我正在使用 .NET Framework 4.7.2 探索 System.Numerics.Vector(我正在处理的项目无法迁移到 .NET Core 3 并使用新的 Intrinsics 命名空间)。该项目正在处理非常大的 CSV/TSV 文件,我们花费大量时间遍历字符串以查找逗号、引号等,我正在努力加快进程。

到目前为止,我已经能够使用 Vector 来识别字符串是否包含给定字符(使用 EqualsAny 方法)。这很好,但我想更进一步。我想使用 Vector 有效地找到该字符的索引。我不知道怎么。下面是我用来确定字符串是否包含逗号的函数。

private static readonly char Comma = ',';
public static bool HasCommas(this string s)
{
    if (s == null)
    {
        return false;
    }

    ReadOnlySpan<char> charSpan = s.AsSpan();
    ReadOnlySpan<Vector<ushort>> charAsVectors = MemoryMarshal.Cast<char, Vector<ushort>>(charSpan);
    foreach (Vector<ushort> v in charAsVectors)
    {
        bool foundCommas = Vector.EqualsAny(v, StringExtensions.Commas);
        if (foundCommas)
        {
            return true;
        }
    }

    int numberOfCharactersProcessedSoFar = charAsVectors.Length * Vector<ushort>.Count;
    if (s.Length > numberOfCharactersProcessedSoFar)
    {
        for (int i = numberOfCharactersProcessedSoFar; i < s.Length; i++)
        {
            if (s[i] == ',')
            {
                return true;
            }
        }
    }

    return false;
}

我知道我可以使用上面的函数并扫描生成的向量,但这会破坏使用向量的目的。我听说新的 Intrinsics 库可以提供帮助,但我无法将我的项目升级到 .NET Core 3。

给定一个向量,你如何有效地找到一个字符的位置?有没有我不知道的聪明把戏?

标签: c#.netvectorvectorizationsystem.numerics

解决方案


推荐阅读