Programista w mojej pracy, który przez całe życie korzystał z Linuksa, krytykował Windows za posiadanie systemu plików bez rozróżniania wielkości liter (między innymi), co według niego jest najgorszym możliwym pomysłem i nigdy nie może być korzystne. Powiedziałem, że dzieje się tak tylko dlatego, że był przyzwyczajony do systemów plików z rozróżnianiem wielkości liter, i że rozsądniej jest mieć system plików bez rozróżniania wielkości liter (część mojego rozumowania polega na tym, że mam na imię David
, ale jeśli odniosłeś się do mnie david
, zrobiłbym to wciąż wiem, że miałeś na myśli mnie i to samo powinno dotyczyć plików). Następnie wyjaśnił swoją pozycję, stwierdzając, że system plików bez rozróżniania wielkości liter musi zostać obciążony spadkiem wydajności.
Zastanawiam się więc ... w jaki sposób system plików bez rozróżniania wielkości liter ma dostęp do plików? Pozwól mi wyjaśnić, co myślę:
Załóżmy, że masz system plików z rozróżnianiem wielkości liter (i jądra systemu operacyjnego itp.), Tak więc w praktyce, jeśli istnieje katalog o nazwie o nazwie exampleDir
, muszę wpisać w nim dokładnie cd exampleDir
cd. Jeśli piszę cd exampledir
, powinienem otrzymać błąd, że katalog nie istnieje. Wydaje mi się, że to prosta sprawa. Kiedy wpisuję polecenie, system plików może po prostu pobrać dokładnie te znaki, które wpisałem (ignorując to, co jądro może zrobić, aby dodać bieżącą ścieżkę katalogu roboczego do łańcucha itd.) I rozpocząć przeglądanie listy dostępnych nazw plików, wykonując bezpośrednie porównaj każde imię; na przykład:
for(var i=0;i<files.length;i++) {
if(filename == files[i]) return true;
}
Teraz interesująca część : system plików bez rozróżniania wielkości liter (zakładając zachowanie wielkości liter , jak w systemie Windows). W praktyce, jeśli istnieje katalog o nazwie o nazwie exampleDir
, mógłbym wpisać cd exampleDir
lub cd eXamPleDIr
i nadal udałoby mi się dostać do tego folderu. Naprawdę chcę wiedzieć, jak wygląda kod, aby to osiągnąć. Aby zachować wielkość liter, nazwa katalogu musi być przechowywana z jej wielkością. Czy to oznacza, że za każdym razem, gdy chcesz uzyskać dostęp do pliku po nazwie pliku , musisz wykonać dwie konwersje małymi lub dużymi literami? Jak duży wpływ na wydajność ma to przełożenie? Czy są jakieś sztuczki, które zmniejszają spadek wydajności wynikający z używania systemu plików bez rozróżniania wielkości liter? Tak wyobrażam sobie kod systemu plików, który musiałby wyglądać:
for(var i=0;i<files.length;i++) {
if(toLowercase(filename) == toLowercase(files[i])) return true;
}
Uwaga: Ponieważ wydaje się, że nie było to jasne z mojego pytania, absolutnie nie pytam, który typ jest lepszy, ani nie pytam o zalety i wady. Mam tylko pytanie, jak (pod względem technicznym) bez uwzględniania wielkości liter zajmuje system plików z faktu, że ludzie mogą wpisać nazwę pliku z losowym przypadku.
źródło
Odpowiedzi:
Systemy operacyjne zazwyczaj działają z uchwytami. Wywoływana jest funkcja „otwarta”, która określa nazwę pliku, i zwracany jest uchwyt. Dalsze połączenia We / Wy zajmują uchwyt, a nie nazwę pliku.
Inne funkcje wymagające nazwy pliku to tworzenie plików, wyświetlanie katalogu i usuwanie plików.
Tak więc każde uderzenie wydajności związane z nierozróżnianiem wielkości liter nie będzie miało tak naprawdę wpływu na wiele rzeczywistych operacji we / wy, a jedynie na zarządzanie plikami.
Niektóre programy używają plików blokady, aby wskazać, że zasoby są w użyciu. To może przełożyć się na wiele tworzenia i usuwania.
Jednak narzut związany z wykonaniem dwóch porównań zamiast jednego jest prawdopodobnie kwestią kilku dodatkowych instrukcji języka asemblera. Oznacza mniej niż 50 cykli. Może 500 lub 5000, jeśli pojawią się błędy w pamięci podręcznej.
Naprawdę, naprawdę nie warto się martwić, chyba że dosłownie martwisz się wydajnością tworzenia / usuwania miliardów plików w krótkim czasie. Aplikacje we / wy na wysokim dysku obejmują takie rzeczy, jak bazy danych, a bazy danych zwykle otwierają kilka bardzo dużych plików i utrzymują je otwarte podczas korzystania z bazy danych. Więc tego rodzaju aplikacje - takie, które zwykle wymagają wszystkich istniejących we / wy dysku - nie wykonują wielu wywołań, w których nazwa pliku musi zostać przeanalizowana.
Szybkość medium będzie wąskim gardłem na długo przed zbliżającym się czasem, gdy zajmą się nazwami plików.
źródło
Jeśli przyjmiesz, że w samym systemie plików rozróżniana jest wielkość liter, o ile pozwala on na przechowywanie nazwy pliku bez użycia wielkich i małych liter, wówczas w przypadku niektórych operacji musi istnieć pewien rodzaj ograniczenia wydajności.
Na przykład powiedz, że masz plik,
foobar.txt
a następnie powiesz programowi, aby go zapisał, ponieważfooBar.txt
nie sprawdza, czy już istnieje.Dla każdego pliku utworzonego w systemie bez rozróżniania wielkości liter musi wykonać tylko jedno wyszukiwanie - dokładnie taką nazwę, jaką podałeś. Oszczędzaj, gotowe.
Dla każdego pliku utworzonego w systemie z rozróżnianiem wielkości liter musi albo wyszukać każdą kombinację „foobar” „Foobar” „fOobar” lub buforować listę plików, a następnie przekonwertować całą listę nazw plików na niższe lub wyższe spraw i przeszukaj to, aby sprawdzić, czy istnieją zduplikowane pliki. To samo dotyczy odczytu plików, jeśli dokładne dopasowanie nie zadziałało, musi sprawdzić wszystkie możliwości.
Istnieje ogromna różnica w ilości pracy, którą musi wykonać sterownik systemu plików, aby sprawdzić istnienie pliku.
Za odczytywanie nazw plików system ma znacznie mniejszą karę, w prawie wszystkich przypadkach sterownik systemu plików przekazuje listę plików do programu, który o to poprosił. Jestem pewien, że widziałem, jak ludzie wspominają, że można tworzyć „zduplikowane” nazwy plików w systemie plików NTFS przy użyciu systemu bez rozróżniania wielkości liter, takiego jak Linux i Windows, który sobie z tym radzi.
Systemy bez rozróżniania wielkości liter wymagają więcej pracy po stronie programistów, ale nieco upraszczają widok rzeczy z perspektywy użytkownika. Istnieją dwa za i przeciw obu sposobów robienia rzeczy.
Po pierwsze, widzę problem w systemach rozróżniających wielkość liter w przypadku błędów programowania zależnych od wielkości liter podczas odczytu plików. Jeśli twój program na stałe zakoduje żądanie
/etc/fish
i ktoś zmieni jego nazwę na/etc/Fish
(lub zapomniałeś przytrzymać Shift dla „f”), wtedy pojawi się błąd, którego w innym przypadku nie wystąpiłby w systemie bez rozróżniania wielkości liter.Chodzi o to, gdzie wkładasz wysiłek, i są kompromisy w obu sposobach robienia rzeczy.
źródło
toLowercase()
każdej nazwy pliku do porównania, ale LawrenceC umieścił to w perspektywie i teraz zdaję sobie sprawę, że dodatkowy czas procesora jest nieznaczny w porównaniu do oczekiwania na dysku dla IO (nawet dla dysku SSD) .