EDIT3:
使用,而不是爲什麼Java中的字符串比較(CompareTo)比C#更快?
StringComparer comparer1 = StringComparer.Ordinal;
IComparable v
IComparable w
comparer1.Compare(v, w)
解決運行時的問題。
我已經做了Java和C#的排序算法(例如快速排序,歸併排序)一些基準。
我使用Java 7和.NET Framework 4.5來實現和執行我的算法。它表明所有的算法都可以使用Java實現更好的運行時間。
對於快速排序的一些示例的運行時間:
C#
- N =百萬4433毫秒
- N = 2000000 10047毫秒
爪哇
- N =百萬1311毫秒
- N = 2000000 3164毫秒
使用分析工具然後我已經做了措施:C#所使用的運行時對字符串比較的75%(即CompareTo),而Java僅使用運行時的2%進行比較。
爲什麼字符串比較在C#中而不是在Java中如此昂貴?我已經測試了C#排序函數Arrays.sort(INPUT)它可以實現約3000毫秒的n = 1000000,所以我不認爲代碼是問題。但不管怎麼說:
下面的代碼爲快速排序:
public class Quicksort {
public static void sort(IComparable[] a) {
sort(a, 0, a.Length - 1);
}
private static void sort(IComparable[] a, int lo, int hi) {
if (hi <= lo) return;
int j = partition(a, lo, hi);
sort(a, lo, j-1);
sort(a, j+1, hi);
}
private static int partition(IComparable[] a, int lo, int hi) {
int i = lo;
int j = hi + 1;
IComparable v = a[lo];
while (true) {
while (less(a[++i], v))
if (i == hi) break;
while (less(v, a[--j]))
if (j == lo) break;
if (i >= j) break;
exch(a, i, j);
}
exch(a, lo, j);
return j;
}
public static IComparable select(IComparable[] a, int k) {
if (k < 0 || k >= a.Length) {
throw new Exception("Selected element out of bounds");
}
Rnd.Shuffle(a);
int lo = 0, hi = a.Length - 1;
while (hi > lo) {
int i = partition(a, lo, hi);
if (i > k) hi = i - 1;
else if (i < k) lo = i + 1;
else return a[i];
}
return a[lo];
}
private static bool less(IComparable v, IComparable w) {
return (v.CompareTo(w) < 0);
}
private static void exch(Object[] a, int i, int j) {
Object swap = a[i];
a[i] = a[j];
a[j] = swap;
}
}
快速排序進行測量計算方式如下:
Stopwatch.Restart();
Quicksort.sort(stringArray);
Stopwatch.Stop();
EDIT2:有人想看看Java版本。這是完全一樣的我只是使用Comparable而不是IComparable和Array.length而不是Array.Length
請顯示您正在使用的代碼。有很多事情可能會影響到這一點。 – 2013-03-05 00:17:52
我對這裏發生的事情有懷疑*,但我正在等待看代碼。 – 2013-03-05 00:23:10
@RBarryYoung我不認爲他想在這裏提出任何要求。我認爲他在做出正確的事情,試圖在得出結論之前確定可能的原因。但的確我們需要看到測試方法來幫助他們。 – AaronLS 2013-03-05 00:26:14