2015-07-16 71 views
5

Zawsze boję się ogłaszać, że rzeczy są tylko wariantami przy założeniu, że zostanie przydzielona niepotrzebna duża ilość pamięci."Dim myarray() jako ciąg" VS "Dim myarray() jako wariant"

Ostatnio pracuje nad poprawą wydajności arkusza ja jednak dostał odwrotny wrażenie (patrz Edycja): Dim myarray() as Variant była poprawa wydajności w porównaniu do Dim myarray() as String

Co będzie kluczem różnice i konsekwencje dwóch deklaracji?

Nie można znaleźć jasne wytyczne tutaj: https://msdn.microsoft.com/en-us/library/aa711948.aspx

EDIT: Controlled Performance Test

Pobiegłem test wydajności sterowane (wziąć wersję dim myarray() as Variant, zrób kopię i zmienić dwie zmienne do Dim myarray() as String)

Jak widać poniżej się pomyliłem, różnica w wydajności NIE jest znacząca.

Dim myarray() as Variant VERSION

Start 4:05:47 PM
FXLoaded 4:05:47 PM 00:00 TDLoaded 4:06:38 PM 00:51 LisofPCTD 4:06:57 PM 00:19 YDLoaded 4:07:47 PM 00:50 LisofPCYD 4:08:14 PM 00:27 PrintCoBTD 4:08:46 PM 00:32 PrintCoBYD 4:09:18 PM 00:32 Total 03:31 03:31

Dim myarray() as String VERSION

Start 4:25:53 PM
FXLoaded 4:25:53 PM 00:00 TDLoaded 4:26:53 PM 01:00 LisofPCTD 4:27:10 PM 00:17 YDLoaded 4:28:07 PM 00:57 LisofPCYD 4:28:32 PM 00:25 PrintCoBTD 4:29:03 PM 00:31 PrintCoBYD 4:29:34 PM 00:31 Total 03:41 03:41

+0

Jedyną rzeczą, którą zmieniono, było wyłączenie 'Wariant' dla' String'? Czy zdarzyło Ci się, aby kod zweryfikował twoją hipotezę, że prędkość została poprawiona? – Chrismas007

+1

Podany link jest do VB.Net, który nie jest bezpośrednio związany. Zdecydowanie preferuję używanie wariantów dla tablic ze względu na ich elastyczność, szczególnie przy użyciu składni 'Dim myarray As Variant' (wariant, który może pomieścić tablicę zamiast szeregu wariantów) Użyłem takich rzeczy z aż 100 000 wpisów (lub więcej) bez problemu, ale YMMV –

+0

@JohnColeman Nie mam jeszcze na ten temat źródła, ale myślę, że mówisz do odpowiedzi właśnie tam .. Tablice są jedynym typem, jaki widziałem, zasugerowałem użycie 'Wariantu 'type. Kiedy używasz typu' String', musisz myśleć o wszystkich dodatkowych znakach potrzebnych do zdefiniowania łańcucha jako tablicy. – Chrismas007

Odpowiedz

1

Sensowne zadeklarować tablicę jako niezależnie od typu danych tablica zostanie trzyma ten zapewnia jasność dla każdego, kto szuka w kodzie w przyszłości. Generalnie lepiej jest nadać czytelność kodu, poświęcając niewielką oszczędność pamięci (chociaż może to być zależne od scenariusza). Na przykład, jeśli twoja tablica będzie zawierała tylko łańcuchy, zadeklaruj tablicę jako łańcuch. Natomiast jeśli twoja tablica będzie zawierać mieszaninę liczb całkowitych i łańcuchów, wówczas należy użyć wariantu.

Zasadniczo, zadeklaruj tablicę jako typ danych, który jest logiczny dla tego, co tablica ma zamiar przechowywać.

Jeśli chcesz wypełnić tablicę z arkusza roboczego, musisz zadeklarować zmienną jako wariant. Próba wypełnienia tablicy (wartościami z arkusza roboczego), która została zadeklarowana jako ciąg, spowoduje komunikat debugowania "Brak zgodności typu", niezależnie od tego, czy wartości zakresu są wszystkie ciągi.

Oto niektóre MSDN documentation dotyczące tablic wewnątrz VBA.

Tak samo postępuję z zadeklarowanymi tablicami. Uczynienie kodu łatwiejszym do odczytania dla przyszłych programistów>niewielkie zapisy pamięci z.