Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# #是的!这使速度提高了80倍。请看这一行: Enumerable.Range(char.MinValue, char.MaxValue - char.MinValue)_C#_Arrays_Performance_Loops_Jagged Arrays - Fatal编程技术网

C# #是的!这使速度提高了80倍。请看这一行: Enumerable.Range(char.MinValue, char.MaxValue - char.MinValue)

C# #是的!这使速度提高了80倍。请看这一行: Enumerable.Range(char.MinValue, char.MaxValue - char.MinValue),c#,arrays,performance,loops,jagged-arrays,C#,Arrays,Performance,Loops,Jagged Arrays,char.MaxValue是65536。因此,如果N=181,则循环为181x181x65536!我刚刚运行了探查器来确认:98.4%的CPU时间花在wordSplit中的ToArray()调用上。请参阅最后的更新: 这里有一些“低挂果实”,可以在不改变算法本身的情况下大大加快速度: wordSplit()每次调用时都会重新计算“标点符号”。在前面做一次 您正在为同一个句子调用wordSplit()N^2次,而不是N次,因为它同时位于外部(x1,x2)循环和内部(y1,y2)循环中。你只需要拆分

char.MaxValue是65536。因此,如果N=181,则循环为181x181x65536!我刚刚运行了探查器来确认:98.4%的CPU时间花在wordSplit中的ToArray()调用上。

请参阅最后的更新:

这里有一些“低挂果实”,可以在不改变算法本身的情况下大大加快速度:

  • wordSplit()每次调用时都会重新计算“标点符号”。在前面做一次
  • 您正在为同一个句子调用wordSplit()N^2次,而不是N次,因为它同时位于外部(x1,x2)循环和内部(y1,y2)循环中。你只需要拆分181个句子,而不是181^2个句子。因此,相反,循环遍历结果,对每个句子调用wordSplit一次,并存储该结果。如果这占用了太多的内存,请查看memorization(),尽管我认为您应该没问题,因为它只会导致文本增加约1份副本
  • 在Intersect()之后不需要ToList()。这将创建一个您不使用的列表
  • 我对mainSentenceCoord和Secondary SentenceCoord的价值感到困惑。生成的相交射线的尺寸是多少

    天哪#就是它!这使速度提高了80倍。请看这一行:

    Enumerable.Range(char.MinValue, char.MaxValue - char.MinValue)
    

    char.MaxValue是65536。因此,如果N=181,则循环为181x181x65536!我刚刚运行了探查器来确认这一点:98.4%的CPU时间花在wordSplit中的ToArray()调用上。

    您基本上是将一个文档中的X个句子与另一个文档中的Y个句子进行比较,这将进行X*Y比较,而且由于每个比较本身都有点昂贵,是的,这需要时间。因为你在做普通单词,你有没有可能把一个文档预处理到一个由单词输入的字典中,然后再把同一个文档中的句子相互比较,然后每个句子都会得到一个分数,代表它对其他句子的公平程度。不知道我是否解释得很好。我觉得压缩数组的问题在于,即使将数组与字典进行比较,分数也需要基于句子之间的比较,这将丢失。我投票将这个问题作为离题题结束,因为它更适合codereview.stackexchange.comSo,基于70句话的基线,181句话所需的时间应该和你预期的一样。在70句的情况下,您正在进行70*70比较(4900)。在181案件中,你做的是32761。32761 / 4900 ~= 6.7. 因此,在最坏的情况下,181个判决的案件应该需要6.7倍的时间。很明显,启动时间和其他固定时间成本不应该包括在内。我同意Lasse V.Karlsen的观点。转换为HashSet,并通过一个简单的枚举和另一个的.Contains()来比较它们。我知道段落有点复杂,但我相信你能做到。你基本上是在比较一个文档中的X个句子和另一个文档中的Y个句子,这将进行X*Y比较,而且由于每个比较本身都有点昂贵,是的,这需要时间。因为你在做普通单词,你有没有可能把一个文档预处理到一个由单词输入的字典中,然后再把同一个文档中的句子相互比较,然后每个句子都会得到一个分数,代表它对其他句子的公平程度。不知道我是否解释得很好。我觉得压缩数组的问题在于,即使将数组与字典进行比较,分数也需要基于句子之间的比较,这将丢失。我投票将这个问题作为离题题结束,因为它更适合codereview.stackexchange.comSo,基于70句话的基线,181句话所需的时间应该和你预期的一样。在70句的情况下,您正在进行70*70比较(4900)。在181案件中,你做的是32761。32761 / 4900 ~= 6.7. 因此,在最坏的情况下,181个判决的案件应该需要6.7倍的时间。很明显,启动时间和其他固定时间成本不应该包括在内。我同意Lasse V.Karlsen的观点。转换为HashSet,并通过一个简单的枚举和另一个的.Contains()来比较它们。我意识到段落有点复杂,但我相信你能做到更新让我大吃一惊我正试着了解一下Coord变量和intersectionArray,这是一个2D数组,它保存着句子编号^2,这样我就可以看到任何句子的交叉值,可视化它就像一张时间表卡片,你可以沿着它往下走到3x5等等。我需要所有这些值,因为它允许我进行分析,比如在一个段落或某物中的常用词。我试图理解你添加的eureka更新,尽管关于我放置/替换的位置,我不会假装我理解“enumerable.range”行的含义,但我实现了你的所有建议,而且现在是即时的。我已经更新了我的问题,以显示我现在如何拥有它,谢谢!你更新让我大吃一惊我正试着了解一下Coord变量和intersectionArray,这是一个2D数组,它保存着句子编号^2,这样我就可以看到任何句子的交叉值,可视化它就像一张时间表卡片,你可以沿着它往下走到3x5等等。我需要所有这些值,因为它允许我进行分析,比如在一个段落或某物中的常用词。我试图理解你添加的eureka更新,尽管关于我放置/替换的位置,我不会假装我理解“enumerable.range”行的含义,但我实现了你的所有建议,而且现在是即时的。我已经更新了我的问题,以显示我现在如何拥有它,谢谢!
        public List<List<string>> createWordList()
        {
            List<List<string>> wordList = new List<List<string>>();
            var symbols = "£$€#&%+-.";
            var punctuationsChars = Enumerable.Range(char.MinValue, char.MaxValue - char.MinValue)
                                        .Select(i => (char)i)
                                        .Where(c => char.IsPunctuation(c))
                                        .Except(symbols)
                                        .ToArray();
    
            for (int x1 = 0; x1 < results.Length; x1++)
            {
                for (int x2 = 0; x2 < results[x1].Length; x2++)
                {
                    var words = results[x1][x2].Split(punctuationsChars)
                                                .SelectMany(x => x.Split())
                                                .Where(x => !(x.Length == 1 && symbols.Contains(x[0])))
                                                .Distinct()
                                                .ToList();
                    wordList.Add(words);                    
                }
            }
            return wordList;
        }
    
        protected void intersectionMatrix()
        {
            List<List<string>> wordList =  createWordList();
            mainSentenceCoord = -1;
            for (var x = 0; x < wordList.Count; x++)
            {
                secondarySentenceCoord = -1;
                mainSentenceCoord++;
                for (var y = 0; y < wordList.Count; y++)
                {
                    secondarySentenceCoord++;
                    intersectionArray[mainSentenceCoord, secondarySentenceCoord] = wordList[x].Intersect(wordList[y]).Count();
                }
            }
        }
    
    Enumerable.Range(char.MinValue, char.MaxValue - char.MinValue)