W .NET Substring
wynosi O (n) zamiast O (1) Java. Dzieje się tak dlatego, że w .NET obiekt String zawiera wszystkie rzeczywiste same dane znakowe: - więc pobranie podciągu wymaga skopiowania wszystkich danych w nowym podłańcuchu. W języku Java, substring
może po prostu utworzyć nowy obiekt, odwołując się do oryginalnej tablicy znaków, z innym początkowym indeksem i długością.
Są plusy i minusy każdego podejścia:
- podejście .NET zawiera lepszej spójności pamięci podręcznej, stwarza mniejsze obiekty , a unika się sytuacji, w której jedna mała podciąg zapobiega bardzo dużą
char[]
będąc garbage zebrane . Wierzę, że w niektórych przypadkach może to również ułatwić wewnętrzną interopcję.
- podejście Javy ułatwia podejmowanie podciąg bardzo wydajny, a prawdopodobnie niektóre inne operacje zbyt
Jest trochę bardziej szczegółowo w moim strings article.
Jeśli chodzi o ogólną kwestię unikania pułapek wydajności, myślę, że powinienem mieć gotową odpowiedź gotową do wycinania i wklejania: upewnij się, że Twoja architektura jest wydajna i implementuj ją w najbardziej czytelny sposób. Zmierz wydajność i zoptymalizuj miejsce, w którym znajdują się wąskie gardła.
Nawiasem mówiąc, dzięki temu string
wyjątkowy - to nie tylko typ matrycowy, którego wykorzystanie pamięci zależy od przykład w tym samym CLR.
Dla małych strun to duża wygrana. Wystarczająco złe jest to, że istnieje cały koszt związany z obiektem , ale w przypadku, gdy w grę wchodzi także dodatkowa tablica, ciąg znaków jednoznakowych może zająć około 36 bajtów w Javie. (To jest liczba "palców w powietrzu" - nie pamiętam dokładnych kosztów obiektu, zależy to również od używanej maszyny wirtualnej.)
Dlaczego nie uruchamiać własnych mikro testów porównawczych, aby przetestować to ? Czy możesz linkować do źródeł, które mówią, że ma "złą" wydajność? – Oded
@Oded: source to komentarz Danny Chena tutaj http://stackoverflow.com/questions/3474254/how-to-make-a-first-letter-capital-in-c/3474263#3474263; Szczerze mówiąc, byłbym zdziwiony, gdyby 'Substring' nie był operacją" O (1) 'czasu i przestrzeni (jak np. Java), ale daję mu korzyść z wątpliwości, ponieważ nie znam .NET. – polygenelubricants
Co to znaczy "zła skuteczność"? W stosunku do czego? .NET ma również słabą wydajność, na przykład w porównaniu z C++. Czy powinniśmy z tego zrezygnować .NET? –