介绍
我有一个我最喜欢的算法,我在很久以前就已经制作了这种算法,我总是用新的编程语言,平台等作为某种基准来编写和重写.虽然我的主要编程语言是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) 假设我有
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)
从这里,我将知道如何进一步挖掘和访问属性(使用与上述相同的原理)
我正在尝试扩展类,并设法扩展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++更熟悉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# ×4
algorithm ×1
c++ ×1
linq ×1
optimization ×1
performance ×1
reflection ×1
substring ×1
suffix-tree ×1