小编Ilh*_*han的帖子

String.Substring()似乎是这个代码的瓶颈

介绍

我有一个我最喜欢的算法,我在很久以前就已经制作了这种算法,我总是用新的编程语言,平台等作为某种基准来编写和重写.虽然我的主要编程语言是C#,但我只是简单地复制粘贴代码并稍微改变了语法,用Java构建它并发现它运行速度提高了1000倍.

代码

有相当多的代码,但我只是提出这个似乎是主要问题的代码片段:

for (int i = 0; i <= s1.Length; i++) 
{
    for (int j = i + 1; j <= s1.Length - i; j++)
    {
        string _s1 = s1.Substring(i, j);
        if (tree.hasLeaf(_s1))
         ...
Run Code Online (Sandbox Code Playgroud)

数据

重要的是要指出此特定测试中的字符串s1的长度为1百万字符(1MB).

测量

我在Visual Studio中描述了我的代码执行,因为我认为构建树的方式或者我遍历它的方式并不是最佳的.在检查结果后,看起来该线路string _s1 = s1.Substring(i, j);可以容纳超过90%的执行时间!

补充意见

我注意到的另一个不同之处在于,尽管我的代码是单线程的,Java使用所有8个内核(100%CPU利用率)来管理它,而即使使用Parallel.For()和多线程技术,我的C#代码也设法使用35-最多40%.由于算法与核心数(和频率)成线性比例,我已经对此进行了补偿,但Java中的片段仍然执行速度快100-1000倍.

推理

我认为发生这种情况的原因与C#中的字符串是不可变的这一事实有关,因此String.Substring()必须创建一个副本,因为它在嵌套的for循环中有很多次迭代我假设有很多复制和垃圾收集正在进行,但是,我不知道如何在Java中实现Substring.

此时我有什么选择?子串的数量和长度没有办法(这已经最大化了).是否有一种我不知道的方法(或许可能是数据结构)可以为我解决这个问题?

请求最小化实施(来自评论)

我遗漏了后缀树的实现,它在构造中是O(n),在遍历中是O(log(n))

public static double compute(string s1, string s2)
{
    double score = 0.00;
    suffixTree stree = new suffixTree(s2);
    for (int i = 0; i <= s1.Length; …
Run Code Online (Sandbox Code Playgroud)

c# performance substring

73
推荐指数
1
解决办法
5127
查看次数

如何使用反射从dbContext获取DbSet &lt;SomeClass&gt;(EF)?

假设我有

DBContext principal = new DBContext();
var x = principal.GetType().GetProperty("SomeClass").GetType();
Run Code Online (Sandbox Code Playgroud)

我现在有了DbSet <SomeClass>的PropertyInfo

我现在想做的是以某种方式进行迭代(例如转换为列表)并从表中的每一行获取值。

想象我可以这样做:

x[0] // would be the 0th entery in DbSet<SomeClass>, the first row aka of type SomeClass
Run Code Online (Sandbox Code Playgroud)

从这里,我将知道如何进一步挖掘和访问属性(使用与上述相同的原理)

c# linq reflection entity-framework

2
推荐指数
1
解决办法
2508
查看次数

是否可以扩展List <T>但仅适用于T =精确类型?

我正在尝试扩展类,并设法扩展List<T>以获得乐趣:

public static void SomeCustomSort<T>(this List<T> list, string item)
{
    if (typeof(T) != typeof(string) || list.Count == 0)
        return;

    // doStuff();
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更智能的方法来扩展List<T>,List<string>以便我的扩展方法没有列出或可访问任何其他类型T

c# extension-methods

1
推荐指数
2
解决办法
1030
查看次数

为什么将此代码段从C#转换为C++会降低性能?

我比C++更熟悉C#所以我必须就这个问题寻求建议.我不得不将一些代码片段重写为C++,然后(令人惊讶地)遇到了性能问题.

我把问题缩小到这些片段:

C#

   public class SuffixTree
    {
        public class Node
        {
            public int Index = -1;
            public Dictionary<char, Node> Children = new Dictionary<char, Node>();
        }

        public Node Root = new Node();
        public String Text;

        public SuffixTree(string s)
        {
            Text = s;
            for (var i = s.Length - 1; i >= 0; --i)
                InsertSuffix(s, i);
        }

        public void InsertSuffix(string s, int from)
        {
            var cur = Root;
            for (int i = from; i < s.Length; ++i)
            {
                var c = s[i]; …
Run Code Online (Sandbox Code Playgroud)

c# c++ algorithm optimization suffix-tree

0
推荐指数
1
解决办法
124
查看次数