EDIT3:
Sử dụngTại sao so sánh String (CompareTo) nhanh hơn trong Java so với trong C#?
StringComparer comparer1 = StringComparer.Ordinal;
thay vì
IComparable v
IComparable w
comparer1.Compare(v, w)
Giải quyết được vấn đề thời gian chạy.
Tôi đã thực hiện một số tiêu chuẩn về các thuật toán sắp xếp (ví dụ: Quicksort, Mergesort) trong Java và C#.
Tôi đã sử dụng Java 7 và .NET Framework 4.5 để triển khai và thực thi các thuật toán của mình. Nó cho thấy rằng tất cả các thuật toán có thể đạt được thời gian hoạt động tốt hơn bằng cách sử dụng Java.
Một số runtimes ví dụ cho Sắp xếp nhanh:
C#
- n = 1000000 4433 ms
- n = 2000000 10.047 ms
Java
- n = 1000000 1311 ms
- n = 2000000 3164 ms
Sau đó, tôi đã thực hiện các biện pháp sử dụng công cụ profiling: C# sử dụng 75% thời gian chạy để so sánh chuỗi (ví dụ: CompareTo), trong khi Java chỉ sử dụng 2% thời gian chạy để so sánh.
Tại sao so sánh chuỗi quá đắt trong C# chứ không phải trong Java?
EDIT: Tôi cũng đã thử nghiệm hàm sắp xếp C# Arrays.sort (INPUT) nó có thể đạt được khoảng 3000 ms cho n = 1000000, vì vậy tôi không nghĩ rằng mã đó là vấn đề. Nhưng dù sao:
Dưới đây là các mã cho Sắp xếp nhanh:
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;
}
}
Sắp xếp nhanh được đo sau đó như sau:
Stopwatch.Restart();
Quicksort.sort(stringArray);
Stopwatch.Stop();
EDIT2: Ai đó muốn xem phiên bản Java. Nó chính xác giống như tôi chỉ sử dụng Comparable thay vì IComparable và Array.length thay vì Array.Length
Vui lòng hiển thị mã bạn đang sử dụng. Có một số thứ có thể ảnh hưởng đến điều này. –
Tôi có một * nghi ngờ * về những gì đang xảy ra ở đây - nhưng tôi đang chờ xem mã. –
@RBarryYoung Tôi không nghĩ anh ấy đang cố đưa ra bất kỳ tuyên bố nào ở đây. Tôi cho rằng anh ta đang làm đúng, cố gắng xác định nguyên nhân có thể là gì, trước khi đưa ra kết luận. Nhưng thực sự chúng ta cần phải xem phương pháp thử nghiệm để giúp họ với điều đó. – AaronLS