Rychlost VB.NET vs VBA   zodpovězená otázka

VB.NET, Optimalizace, VB6/VBA

Chtěl bych se zeptat na rychlost VB.NET vs VBA. Sestavil jsem kod, ve kterém proběhne 640000 iterací. Když jsem jej spustil pod excelem ve VBA a jako exe soubor napsaný ve visual studiu 2010, tak rozdíl času celého procesu byl téměř nulový. Doufal jsem, že kompilovaný program bude výrazně rychlejší než interpretovaný. Uvažoval jsem špatně? Mám v úmyslu postavit aplikaci, ve které budou probíhat statisíce operací. Zvolil jsem VB.NET správně? Uvažoval jsem o C++ nebo C. Jsou rychlejší? A co C#? Děkuji za radu

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Bez konkrétního kódu se nedá říct, co bude rychlejší.

Obecně nejrychlejší bývá C++ (ale typicky nestojí za ty problémy), VB.NET a C# jsou na tom stejně (je to pořád .NET) a VBA by mělo být nejpomalejší.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ono ten zkušební kód je spíš jen testovací. V zásadě by mělo jít o to, že chci export z programu v xml příp txt obsahující tabulková data převést do databáze pod MySQL o řekněme desetitisících řádků. Sestavení té databáze bude asi na čas nejnáročnější. Ovšem mohl by ho udělat axterní program třeba v C/C++ bez GUI. Práci s databází bych mohl řešit klidně ve VB.NET, je celkem lehký na učení (nejsem programátor, jen si spíš hraju) a vyhledávání v databázi by dělal server. Ovšem pokud by v tom procesorovém čase VB.NET vs C/C++ (v konzole) byl řekněme do 10-15%, tak pro mě nemá smysl šťourat do C-čka. Děkuji moc za reakci. Velice si vážím práce lidí jako jste Vy. Bez různých fór by bylo studium mnohem náročnější.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud aplikace nic nepočítá, ale jen posílá spoustu dotazů do DB, pak je úplně jedno, v čem je napsaná - komunikace s databází je z těch všech operací časově nejnáročnější. Ten zbytek kódu oproti tomu trvá zanedbatelně dlouho, tudíž je jedno, v čem je napsaný.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

No a jestli teda ještě můžu dotaz??? Myslíte, že je časově výhodnější sestavit databázi, z které budu vytahovat data pomocí MySQL nebo sestavit obrovské pole a filtrovat to přímo z pole kódem? Mám strach že práce s polem ve VB bude náročná. Případně by už možná šlo vynechat celou DB i pole a pracovat přímo s *.txt řádek po řádku a vyhledávat maxima? Asi je to už příliš komplikované na popis a určení postupu... Vyzkouším to na příkladu a uvidím. Je VB.NET stejně schopný jako C# příp. C/C++? Děkuji za Váš čas.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pokud budete pracovat s desetitisíci řádky dat,tak určitě použijte DB! Pracovat takto s txt filem je sebevražda.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Záleží, jaké typy úkolů budete dělat a jak jsou řádky velké. Pokud je to jen pár desítek MB, tak v paměti to bude při použití vhodných datových struktur nejrychlejší - daleko lepší, než přenést to do databáze, která než to uloží na disk, s tím udělá milion operací, a pak se jí na to zase ptát znovu.

Přeci jen DB je strašná režie a ne vždy se vyplatí.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak to se ještě zkusím zamyslet a trošku si to spočítat, kolik to vůbec může vzít dat.

Ještě bych se chtěl vrátil k původnímu dotazu. Tady přikládám kód, který jsem kopiloval ve VS 2010 a spustil ve VBA (excel-2003). Ten kompilovaný trval 10s a ten v excelu 8s. Dělám někde chybu? Přece nemůže být stený proces v kompilované verzi pomalejší než v interpretované??? Tuším nějaké začátečnické chyby správně?

Je to jen ukázkový příklad ty výpočty nic neznamenají, jsou jen jako zátěž.

Neuměl jsem nastavit stopky v ms, tak je to tam jen tak hloupě na oko v sekundách. Děkuji moc...

    Function a()
        Dim x As Single
        Dim start, konec As Date

        x = 0
        start = Now
        Do While x < 10000
            Call b(x)
            x = x + 1
        Loop
        konec = Now

        a = 0
        MsgBox(start & "-" & konec)


    End Function
    Function b(ByVal x) As Single
        Dim y As Single
        Dim N As Single
        y = 0
        Do While y < 1000
            N = c(x, y)
            y = y + 1
        Loop
        b = 0
    End Function


    Function c(ByVal x, ByVal y) As Single
        Dim O As Single
        Select Case x
            Case 0 To 2000
                O = x ^ 2 + 1 / (y + 1)
            Case 2000 To 5000
                O = x ^ 3 + 1 / (y + 1) ^ 2
            Case 5000 To 7500
                O = x ^ 4 + y
            Case 7500 To 10000
                O = x ^ 5 + y / 100
        End Select
        c = O
    End Function
nahlásit spamnahlásit spam 0 odpovědětodpovědět

nedal by sem tam šoupnout for cyklus?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Asi dal, netrvám na do while... Je to napsáno jako test rychlostí VBA vs VB.NET. Chtěl jsem napsat kód, ve kterém proběhne spousta cyklů, v rámci kterých se bude volat často nějaká funkce. U interpretu by se asi měla každá funkce při volání převádět na strojový zápis. Pak by v podstatě mělo dojít ku 10mil kompilací f-ce "c" a 10tis kompilací f-ce "b" Pokud ovšem nedojde jen ku kompilaci jedné i druhé pouze jednou. To mi příjde vzhledem k rychlosti pravděpodobnější. Podotýkám, že dotaz zněl "Rychlost VB.NET vs VBA" Překvapilo mě, že VB je pomalejší (cca o 2s) než VBA

nahlásit spamnahlásit spam 0 odpovědětodpovědět

For nebo While, to je v tomto případě jedno.

Potíž je v tom, že měříte velmi krátké úseky. Samotná .NET aplikace potřebuje jen ke startu pár sekund, Excel v době spouštění VBA kódu už máte spuštěný a všechny funkce a knihovny načtené v paměti. Takže to ani není fair srovnání.To je jako srovnávat, jestli je rychlejší auto nebo kolo na 10m úseku. Než člověk stihne vlézt do auta a nastartovat, tak cyklista ujede 50m.

Dejte tam 100x víc iterací a uvidíte, co je rychlejší.

Interpret neznamená, že to kompiluje po řádcích, on nic do strojového kódu nepřevádí. Prostě rozparsuje řádek, vidí, že se v něm do proměnné přiřazuje nějaký výraz - tak si někde vytvoří proměnnou (typicky v nějaké kolekci), výraz vyhodnotí a hodnotu tam předá. Na dalším řádku vidí volání funkce, tak si tu funkci najde a řádek po řádku ji odsimuluje.

V .NETu se každá funkce kompiluje v okamžiku, kdy do ní poprvé vstoupíte, takže ze začátku je aplikace pomalejší (proto ten dlouhý start - vše se načítá do paměti a kompiluje), pak už to jede rychle.

A tu .NET variantu spouštějte v Release módu a bez debuggeru (přes Ctrl-F5), to je daleko rychlejší a tak to běží i ve skutečnosti.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pomalost interpretovaných jazyků je z velké části mýtus, který vychází z pomalosti prvních primitivních interpreterů. Moderní interpretery obsahují předkompilaci. Mimoto .net se kompiluje do mezijazyka IL, který se teprve při spuštění aplikace "interpretuje", tedy v souladu s předchozí větou kompiluje do strojových intrukcí.

VB.NET, proč ne, osobně je mi bližší C# už jenom proto že je case sensitive.

Z dotazu hlavně není zřejmé, co že to vlastně chcete dělat. Pokud to chcete nastrkat do databáze, pak to jednou přefiltrovat a zahodit databázi, tak použití databáze nemá smysl.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

VBA ale určitě předkopilaci ani JIT nemá, Javascript v prohlížečích třeba už ano, ale dalším problémem je, že VBA ani není na většině míst silně typový, takže každé volání funkce není prostý přechod na danou adresu v paměti (jako v .NETu), ale dohledávání v tabulce funkcí podle názvu a typů parametrů.

.NET aplikace se navíc dají prohnat ngenem a zkompilovat rovnou, mnoho aplikací to při instalaci dělá.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback