[ Pobierz całość w formacie PDF ]
.Pamiętajo wyłączeniu tej opcjipo zakończeniutworzenia aplikacji.Bezpieczne modyfikowanie ustawień silnika JetIstnieją trzy sposoby modyfikowania ustawień rejestru silnika Jet:u Bezpośrednie edytowanie wartości przez Regedit.exe.u Tworzenie profilu użytkownika w celu pominięcia ustawień domyślnych i odwoływanie się do tego profilu przyużyciu wiersza poleceń profilu.u Umożliwienie aplikacjom tymczasowego pomijania ustawień domyślnych poprzez użycie metody SetOptionobiektu bazy danych.Proponujemy korzystanie z trzeciej opcji.Nie tylko dlatego, że jest prosta w użyciu, ale również dlatego, że umożliwiamodyfikowanie ustawień dla każdej aplikacji z osobna.Aby naprawdę zoptymalizować wydajność, możesz nawet zmieniaćustawienia w różnych częściach aplikacji.Technika ta nigdy nie powoduje zmiany ustawień domyślnych, tak więc tworzenie nowych projektów rozpoczyna się wtym samym miejscu.Aby tymczasowo pomijać wartości rejestru, nie musisz odwoływać się do interfejsu API.Silnik bazy danych posiadaodpowiednią metodę i dwa argumenty.Składnia jest następująca:DBEngine.SetOption StałaNazwaUstawienia, WartośćPrzykładowo, wydajność niektórych aktualizacji może wzrosnąć dzięki temu, że Jet będzie czekał przed wykonaniem transakcjiukrytych.Kod, który czasowo wydłuży czas oczekiwania SharedAsyncDelay do 1 sekundy (1000 milisekund), wyglądanastępująco:DBEngine.SetOption dbSharedAsyncDelay, 1000Ustawienie to działa do momentu, aż aplikacja dokona jego zmiany za pomocą metody SetOption, DBEngine wyjdzie pozazakres lub aplikacja zostanie zamknięta.SetOption nie zapisuje wartości do Rejestru.Za pomocą metody SetOption niemożesz zmieniać wartości domyślnych dla SystemDB, CompactByPKey ani wątków.Jeśli Twoja aplikacja używa zródła danych ODBC, przejrzyj ustawieniarejestru w\HKEY_LOCAL_MACHINES\SOFTWARE\MICROSOFT\JET\4.0\ENGINES\ODBC.JetShowPlanDomyślnie nie zainstalowano247Rozdział 14.f& Optymalizacja aplikacjiNarzędziasłużące do pomiaru wydajnościWażne jest, czy łączny wynik Twoich działań spowodował poprawę, a nie obniżenie wydajności aplikacji.Domonitorowania i oceny wydajności jednej techniki względem innej służy klika narzędzi.Pierwszym z nich jest zegar, którymierzy czas wykonywania określonych procesów.Drugim z nich jest nieudokumentowana funkcja, która liczy operacjewykonywane z użyciem dysku, bufora i blokowania.Trzecie narzędzie to opcja Accessa, dzięki której możesz przeglądaćplan wykonywania kwerendy.Pierwsze dwa z tych rozwiązań możesz stosować na prawie każdej z przedstawionych w tymrozdziale technik.Plany wykonywania kwerend mają zastosowanie tylko w przypadku optymalizowania pracy kwerend.Mimo iż VBA posiada funkcję Timer(), może ona być niewystarczająca do oceny działań optymalizacyjnych.Funkcja tamierzy w sekundach upływ czasu od momentu 0:00.Jest ona jednak mało precyzyjna i może nie być odpowiednia doTwoich celów szczególnie, gdy chcesz mierzyć operacje trwające mniej niż 1 sekundę.Wielu programistów używa funkcjiGetTickCount.Mimo iż wydaje się, że funkcja ta zwraca czas w milisekundach, ponieważ jest ona związana z zegaremkomputera, w rzeczywistości mierzy ona czas co 1/18 sekundy, co nie do końca odpowiada milisekundzie.Interfejs APIsystemu Windows posiada zegar, który mierzy czas w milisekundach.Funkcja timeGetTime() mierzy upływ czasu odmomentu uruchomienia systemu Windows.Ponieważ używa innego zegara sprzętowego niż GetTickCount, zwraca czasmierzony z dokładnością do milisekundy.Używając timeGetTime(), możemy wstawić linię kodu przed i za żądanym miejscem i otrzymamy bardzo dokładnypomiar długości trwania danej czynności.Do odwołania się do interfejsu API potrzebujemy dwóch rzeczy: deklaracji funkcji i zmiennej globalnej, która posłuży doprzechowywania początkowego czasu zegara.W części deklaracyjnej modułu wprowadz następujące trzy linie:Private Declare Function a2ku_apigettime Lib "winmm.dll" _Alias "timeGetTime" () As LongDim lngstartingtime As LongTeraz możesz utworzyć procedurę, która uruchomi zegar i funkcję, która go zatrzyma.Sub a2kuStartClock()lngstartingtime = a2ku_apigettime()End SubFunction a2kuEndClock()a2kuEndClock = a2ku_apigettime() lngstartingtimeEnd FunctionWydruk 14.1 ilustruje wykorzystanie tych funkcji do oceny wydajności kwerendy.Wydruk 14.1.Obliczanie czasu wykonywania kwerendySub QueryTimer(strQueryName As String)Dim db As DatabaseDim qry As QueryDefDim rs As RecordsetSet db = CurrentDb()Set qry = db.QueryDefs(strQueryName)'Uruchom zegara2kuStartClockSet rs = qry.OpenRecordset()'Zatrzymaj zegar i wyświetl rezultat w oknie DebugDebug.Print strQueryName & " Wykonano w: " & a2kuEndClock &_" milisekund"rs.CloseEnd SubAby otrzymać jak najdokładniejsze wyniki, umieść odwołania a2kuStart-Clock i a2kuEndClock jak najbliżej analizowanej procedury.248Część IV f& Tajniki VBASpojrzenie za kulisyMimo iż mierzenie czasu jest ważne, nie pozwala ocenić wydajności w trakcie tworzenia aplikacji.Najprawdopodobniejtworzenie aplikacji ma miejsce na platformie dużo szybszej niż te, na których będzie używana, a testowanie odbywa się namniejszym niż w rzeczywistości zestawie danych.Co więcej, zegar nie daje odpowiedzi na pytanie, jak aplikacja będzie działaćna komputerze z mniejszą ilością pamięci lub mniejszym twardym dyskiem.Aby zajrzeć za kulisy Twojej aplikacji, możesz użyćkolejnej nieudokumentowanej funkcji: ISAMStats.Funkcja moża dać Ci kilka cennych wskazówek na temat funkcjonowaniaaplikacji.Mierzy ona sześć operacji mających wpływ na wydajność: odczyty z dysku, zapisy na dysku, odczyty z bufora, odczytyz wyprzedzeniem z bufora, ustanowienia blokowania oraz zdjęcia blokowania.Funkcja ta działa zarówno w Accessie 2000, jak iwe wcześniejszych wersjach tego programu.Jej składnia jest bardzo prosta:DBEngine
[ Pobierz całość w formacie PDF ]