Dlaczego zadania w C# na SPOJu mają często zużyte 128/129MB RAMu?

0

Cześć, czy mógłby mi ktoś wytłumaczyć dlaczego różne zadania robione różnymi algorytmami w C# mają taki sam zużyty RAM i jak można coś z tym zrobić?

sharp.PNG

Dla porownania:
ram.PNG

Da się zejść do takiego poziomu Csharpem?

c# ram usage in competitive

niestety niezbyt wiele zwraca :(

Przykładowe zadanie i rozwiązanie:

ROWNANIE - Równanie kwadratowe

Napisz program, który wyznacza liczbę pierwiastków rzeczywistych równania kwadratowego.
Wejście

Na wejście programu podana zostanie pewna nieokreślona, ale niewielka ilość zestawów danych. Każdy zestaw składać się będzie z 3 liczb rzeczywistych (współczynników A, B i C równania Ax^2 + Bx + C = 0) rozdzielonych spacjami. Poszczególne zestawy zostaną rozdzielone znakiem nowej linii. Można przyjąć, że A jest różne od zera.
Wyjście

Na wyjściu ma się pojawić ciąg liczbowy, którego i-ta pozycja jest równa liczbie pierwiastków rzeczywistych i-tego wczytanego z wejścia równania. Poszczególne liczby należy rozdzielić znakami nowej linii.
Przykład

Wejście:
0.3 0.3 0.4
0.5 1 0.5
-0.5 -0.5 0

Wyjście:
0
1
2

static int amountOfSolutions(double[] arr)
{
	double delta = arr[1]*arr[1] - 4*arr[0]*arr[2];
	return (delta>0) ? 2 : (delta==0 ? 1 : 0 );
}
public static void Main()
{
	StringBuilder input = new StringBuilder();
	while (true)
	{
		input.Clear();
		input.Append(Console.ReadLine());
		if (!string.IsNullOrEmpty(input.ToString()))
		{                    
		   double[] arr = input.ToString().Split(' ').Select( x => Convert.ToDouble(x, CultureInfo.InvariantCulture))
																										   .ToArray(); 
		   Console.WriteLine(amountOfSolutions(arr));
		}
		else
		{
			break;
		}
	}
}
0

Podstawowe pytanie: W jaki sposób pozyskujesz informację o zużyciu RAMu przez dany proces?

0
Manuel.Artificer napisał(a):

Podstawowe pytanie: W jaki sposób pozyskujesz informację o zużyciu RAMu przez dany proces?

Kolumna [MEM] w rezultatach po zaakceptowanym wyniku na SPOJu (obrazek 1)

0

Nie o to mi chodziło. Pytam skąd ta wartość się bierze. Jaki jest kod służący do uzyskania tej informacji, bo tam trzeba szukać.

0

Dobra czaję, SPOJ to serwis, gdzie idzie sprawdzić kod. No cóż no to ciężko stwierdzić co jest przyczyną, pewnie związane z działaniem CLR czyli środowiska uruchomieniowego, dzięki któremu można uruchamiać programy napisane w C#

0

Z tego co wyczytałem na forach SPOJ to prawdopodobnie zajętość pamięci jest mierzona przez sondowanie /proc/<pid>/stat

0
Manuel.Artificer napisał(a):

Nie o to mi chodziło. Pytam skąd ta wartość się bierze. Jaki jest kod służący do uzyskania tej informacji, bo tam trzeba szukać.

Trudno mi odpowiedzieć. My jedynie wrzucamy kod w przeglądarkę.

Obstawiam, że działa to na takiej zasadzie.

Kod który my wrzucamy jest kompilowany, a później na takim execu np. używa się komendy w cmd:

myfile.exe < input.txt > output.txt

I nasz output.txt jest porównywany z odpowiedz_na_zadanie.txt

Tutaj coś o specyfikacji tego na czym jest to odpalane.

Clusters
Your submissions are judged on two clusters called Pyramid and Cube. It is up to problem setter (author of the problem) to choose which cluster should be used to judge submissions to the problem.

Pyramid [deactivated] (Intel Pentium III 733 MHz) - consists of old solid Pentium III machines that serve SPOJ since its very beginning in 2004. Thanks to the fact that these machines are slow, judges created by SPOJ problem setters can more easily test the complexity of the algorithms used in your solution without creating enormous datasets (we can even tell the difference between O(n) and O(nlogn) if needed). On this cluster memory limit for submissions is 256 MB.

Cube (Intel Xeon E3-1220 v5) - this new cluster consists of modern and fast Intel Xeon E3-1220 v5 CPUs. On Cube your submissions will run from 30 to 50 times faster than on Pyramid so you can expect that if you test your solution at home then it will have similar execution time on SPOJ. On this cluster memory limit for submissions is 1536 MB.


1

Tak jak mówiłem w tych wynikach nie jest brana pod uwagę pamięć zużywana przez sam program, a przez środowisko uruchomieniowe CLR podczas ładowania i przetwarzania tego programu (Tak mi się wydaje, argumenty przemawiające za tym poniżej).
Poniżej link do artykułu o pamięci w CLR i programu VMMap (narzędzia do podglądu zużycia pamięci przez program napisany dla platformy .NET).

http://mattwarren.org/2017/07/10/Memory-Usage-Inside-the-CLR/

W JAVIE też jest środowisko bez którego program nie ruszy (JRE), a jak przeglądałem stronkę tego SPOJa to dla JAVY zużycie pamięci jest jeszcze lepsze. Dla najlepszego rozwiązania liczb pierwszych MEM = 1,4GB, poniżej link:

http://pl.spoj.com/ranks/PRIME_T/lang=JAVA

1 użytkowników online, w tym zalogowanych: 0, gości: 1