C# .NET és Mono futásidő

C# .NET és Mono futásidő
2015-02-19T11:13:09+01:00
2015-02-19T15:12:43+01:00
2022-12-02T05:00:41+01:00
Aki nem Te vagy
Sziasztok!



Van egy kódom, ami .NET 4.0 Client Prof alatt (VS 2010 Ultimate) készült, egy feladat megoldása. Az értékelése viszont Mono alatt, Linuxon történik (aki ismeri, a Nemes Tihamér és az OKTV új rendszere). A probléma nem csak az, hogy a cross-platform miatt váratlan helyeken dob hibát - amit ugye csak beadás után tudok meg, és csak annyit róla, hogy volt hiba -, hanem teljesen eltérő futásidőt produkál (Windows: 0,08 s körül maximum Linux: 0,896 s körül maximum), ami egy 0.1 s-es limit mellett erős probléma.

Próbálkoztam néhány felesleges using kiműtésével, ez csak lassította a kódot (de hogy hogyan?).
Esetleg van valami ötletetek, hogy mi okozhat ilyesmi összeütközéseket?



Kód:

using System; using System.Collections.Generic; namespace jarasok { class jarasok { static int N, M, K; static List<int> V; static List<int> Honnan; static List<int> Hova; static int[] Jarasok; static int[,] Tavolsagok; static void Main() { string[] s = Console.ReadLine().Split(' '); N = Convert.ToInt32(s[0]); M = Convert.ToInt32(s[1]); K = Convert.ToInt32(s[2]); V = new List<int>(); Honnan = new List<int>(); Hova = new List<int>(); Tavolsagok = new int[N, M]; Jarasok = new int[M]; s = Console.ReadLine().Split(' '); for (int i = 0; i < s.Length; i++) V.Add(Convert.ToInt32(s[i])); for (int i = 0; i < K; i++) { s = Console.ReadLine().Split(' '); Honnan.Add(Convert.ToInt32(s[0])); Hova.Add(Convert.ToInt32(s[1])); } for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) Tavolsagok[i, j] = -1; for (int i = 0; i < M; i++) Jarasok[i] = 1; for (int i = 0; i < M; i++) { for (int j = 0; j < K; j++) { if (Honnan[j] == V[i]) { Tavolsagok[Hova[j] - 1, i] = 1; } if (Hova[j] == V[i]) { Tavolsagok[Honnan[j] - 1, i] = 1; } } } int keresesi_tavolsag = 1; while (TavolsagHianyzik()) { for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { if (Tavolsagok[i, j] == keresesi_tavolsag) { //Olyan települések, amik pont a kérdéses távra vannak a városoktól for (int k = 0; k < K; k++) { if (Honnan[k] - 1 == i && Tavolsagok[Hova[k] - 1, j] == -1) { Tavolsagok[Hova[k] - 1, j] = keresesi_tavolsag + 1; } if (Hova[k] - 1 == i && Tavolsagok[Honnan[k] - 1, j] == -1) { Tavolsagok[Honnan[k] - 1, j] = keresesi_tavolsag + 1; } } } } } keresesi_tavolsag++; } for (int i = 0; i < N; i++) { if (V.Contains(i + 1)) continue; int min = Tavolsagok[i, 0]; int minp = 0; for (int j = 0; j < M; j++) { if (Tavolsagok[i, j] < min) { min = Tavolsagok[i, j]; minp = j; } } Jarasok[minp]++; } for (int i = 0; i < M; i++) { Console.WriteLine(Jarasok[i]); } } static bool TavolsagHianyzik() { for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) if (!V.Contains(i+1) && Tavolsagok[i, j] == -1) return true; return false; } } }
Köszi
Mutasd a teljes hozzászólást!
De az is segíthet, ha windows alá feltolsz egy monot :)

Teljesítménynövelő tippek:

0. Visual studióban indíts egy profiler sessiont és nézd meg, hogy mi a leglassabb része a kódodnak. Valószínűleg mono-ban is ugyanez, csak sokszorosan lassabb.

1. static int[,] Tavolsagok: a multidimenziós tömbök lassúak lehetnek, próbáld meg lecserélni egy sima [N*M] méretű 1 dimenziós tömbre, és [i*N+j] szintaktikával elérni

2. Cikluson belül ne használj Convert.ToInt()-et

3. TavolsagHianyzik(): a V.Contains(i+1) nem konstans, hanem lineáris futásidejű. Így a függvény O(N*M*k) nagyságrendben fut. Ez elég rosszul hangzik, tekintve, hogy egy while feltételben van a végrehajtása, tehát összességében O(N*M*k*k) a nagyságrend.
Mutasd a teljes hozzászólást!

  • "Váratlan helyeken dob hibát": több konkrétum kéne, hogy ebben segíteni lehessen.

    "eltérő futásidőt produkál": a Mono a .NET-től különböző implenetáció, sajnos ez előfordulhat.

    Miért nem fejlesztesz és tesztelsz Mono alatt, ha egyszer arra a platformra készül?

    Dobj fel egy virtuális gépre egy linuxot és teszteld ott is! Ma már a telefonokban is GB-okban mérik a memóriát, úgyhogy ez nem lehet probléma.
    Mutasd a teljes hozzászólást!
  • több konkrétum kéne, hogy ebben segíteni lehessen.

    Például. Bizonyos esetekben a System.Threading névteret nem találja Mono alatt, bizonyos esetekben a System.Text-et, megjósolhatatlan, hogy mikor mivel van baja. Gépfüggő, találkoztam már olyannal is, hogy egyik esetben megtalálta, másik esetben pedig nem. (fordítási hibával lép vissza...)

    Miért nem fejlesztesz és tesztelsz Mono alatt, ha egyszer arra a platformra készül?

    Mert a versenyen Visual Studio '12 Expresst adnak VirtualBox Win7/normál Win 8.1 mellé, de az értékelő szerver Ubuntu 12.04.
    Mutasd a teljes hozzászólást!
  • De az is segíthet, ha windows alá feltolsz egy monot :)

    Teljesítménynövelő tippek:

    0. Visual studióban indíts egy profiler sessiont és nézd meg, hogy mi a leglassabb része a kódodnak. Valószínűleg mono-ban is ugyanez, csak sokszorosan lassabb.

    1. static int[,] Tavolsagok: a multidimenziós tömbök lassúak lehetnek, próbáld meg lecserélni egy sima [N*M] méretű 1 dimenziós tömbre, és [i*N+j] szintaktikával elérni

    2. Cikluson belül ne használj Convert.ToInt()-et

    3. TavolsagHianyzik(): a V.Contains(i+1) nem konstans, hanem lineáris futásidejű. Így a függvény O(N*M*k) nagyságrendben fut. Ez elég rosszul hangzik, tekintve, hogy egy while feltételben van a végrehajtása, tehát összességében O(N*M*k*k) a nagyságrend.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd