Jak można obliczyć (oszacować) ilość pamięci zajmowanej przez program na Linuxie?

0

Jak można obliczyć (oszacować) ilość pamięci zajmowanej przez program skompilowany na Linux-ie na podstawie kodu i znanej ilości zajmowanej pamięci skompilowanego na Windowsa (5MB)?

0

Oszacować sobie można - coś pomiędzy 1MiB a 1000MiB;

Serio, po co Ci takie obliczenia? Masz 32MB pamięci, że o zajętość się martwisz? Skompiluj pod Linuxa i uruchom - tylko wtedy dowiesz się konkretnie ile program pamięci wymaga w danym momencie jego użytkowania; Na pewno wynik będzie podobny.

0

Właśnie Linux jest TYLKO na laptopie, który się "popsuł". Da się go odzyskać, ale najwcześniej w weekend. Obliczenia są mi potrzebne do OIG (Olimpiada Informatyczna Gimnazjalistów). Napisali, iż moje programy wychodzą poza zakres tablicy i dochodzi do przekroczenia ilości pamięci, której jest max 64MB. A coś się nie chce mi się wierzyć, że ten sam program skompilowany na Windowsa zajmuje ponad 12 razy więcej pamięci w Linuxie.

No chyba, że źle interpretuje, to co mi napisali.

0

Obliczenia są mi potrzebne do OIG (Olimpiada Informatyczna Gimnazjalistów).

Takie informacje powinieneś podać od razu, w pierwszym poście;

Napisali, iż moje programy wychodzą poza zakres tablicy i dochodzi do przekroczenia ilości pamięci, której jest max 64MB.

Czyli Twój kod jest błędy, bo wykroczenie poza zakres tablicy to najzwyklejszy błąd, którego skutkiem jest wyjątek out of range; Musisz taki kod poprawić;

A coś się nie chce mi się wierzyć, że ten sam program skompilowany na Windowsa zajmuje ponad 12 razy więcej pamięci w Linuxie.

To trochę dziwnie brzmi - fakt.

0

Idę o zakład że ilość pamieci zależy od danych wejściowych więc twoje szacowania są z dupy. Albo tworzysz sobie tam tablicę o rozmiarze wczytanym z klawiatury co przekracza dostępną pamięć albo np. masz rekurencje która wychodzi poza dostępny stos.
Podsumowując: nie szukaj dziury w całym, bo problem jest W TWOIM KODZIE

0

Jednak moim zdaniem jeśli wyjątek (wyjście poza zakres tablicy) zachodzi w Linux-ie, to powinien być teź w Windows-ie. Natomiast tu działa prawidłowo.

0

Pokaż ten kod, a zobaczymy czy faktycznie jest poprawnie napisany.

0
program zadanie3;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  s, s2 : string;
  ciag : array of integer;
  wyniki : array of string;
  Count, i, roznica, dane, petla, start, stop : integer;
  b : boolean;

begin
  readln(s);

  s2 := s;
  Delete(s2, pos(' ', s2), Length(s2) + 1 - pos(' ', s2));
  Count := StrToInt(s2);
  Delete(s, 1, pos(' ', s));
  dane := StrToInt(s);

  setlength(ciag, Count + 1);

  readln(s);
  for i := 1 to Count do
  begin
    s2 := s;
    Delete(s2, pos(' ', s2), Length(s2) + 1 - pos(' ', s2));
    ciag[i] := StrToInt(s2);
    Delete(s, 1, pos(' ', s));
  end;
  setlength(wyniki, dane);

  for i := 1 to dane do
  begin
    readln(s);

    b := True;
    s2 := s;
    Delete(s2, pos(' ', s2), Length(s2) + 1 - pos(' ', s2));
    start := StrToInt(s2);
    Delete(s, 1, pos(' ', s));
    stop := StrToInt(s);

    roznica := ciag[start] - ciag[start + 1];
    for petla := start + 1 to stop do
    begin
      if not (ciag[petla - 1] - ciag[petla] = roznica) then
        b := False;
    end;

    if b then
      wyniki[i - 1] := 'Tak'
    else
      wyniki[i - 1] := 'Nie';
  end;

  for i := 0 to dane - 1 do
    writeln(wyniki[i]);

end.
 

Wejście:
10 5
5 5 5 10 15 20 15 10 9 8
3 6
3 7
8 10
7 9
1 10

Wyjście:
TAK
NIE
TAK
NIE
NIE

program zadanie5;

uses
  SysUtils;

var
  s : string;
  i, suma : word;
begin
  readln(s);
  suma := 0;
  Delete(s, pos('?', s), 1);
  for i := 1 to Length(s) do
    Inc(suma, word(s[i]) - 48);
  writeln((3 - suma mod 3) mod 3);

end.
 

wejście:
16?
Wyjście:
2

Są to dwa z pięciu zadań. Wszystko mam wyzerowane.

0

No dobra ale widze że ustawiasz sobie dynamicznie rozmiar tablic w tych programach. A jaką masz pewność że nie ma testu gdzie taka tablica będzie za duża po prostu? Bo rozumiesz że ten sam problem można rozwiązać 10 różnymi algorytmami i nie każdy algorytm dający poprawne wyniki jest poprawnym rozwiązaniem zadania, prawda?

0

A nie lepiej to:

  setlength(ciag, Count + 1);
 
  readln(s);
  for i := 1 to Count do
  begin
    s2 := s;
    Delete(s2, pos(' ', s2), Length(s2) + 1 - pos(' ', s2));
    ciag[i] := StrToInt(s2);
    Delete(s, 1, pos(' ', s));
  end;
  setlength(wyniki, dane);

Zamienić na to:

  setlength(ciag, Count);
 
  readln(s);
  for i := 0 to Count - 1 do
  begin
    s2 := s;
    Delete(s2, pos(' ', s2), Length(s2) + 1 - pos(' ', s2));
    ciag[i] := StrToInt(s2);
    Delete(s, 1, pos(' ', s));
  end;
  setlength(wyniki, dane);

Już zaoszczędzisz pamięć. To raz.
Dwa:

 for petla := start + 1 to stop do
    begin
      if not (ciag[petla - 1] - ciag[petla] = roznica) then
        b := False;
    end;

zmień na

 for petla := start + 1 to stop do
    begin
      if (ciag[petla - 1] - ciag[petla] = roznica) then
        writeln('Tak');
      else
        writeln('Nie');
    end;

i znowu trochę pamięci zaoszczędzone gdyż pozbywamy się niepotrzebnej zmiennej pomocniczej i niepotrzebnej tablicy.

A teraz trochę bolesnej prawdy.
Twój kod to kupa, nie licz, że wygrasz.

0

@babubabu Z tym drugim mogę się nie zgodzić, pomijając twój błąd przy

if (ciag[petla - 1] - ciag[petla] = roznica) then
        writeln('Tak'); //po co ten średnik?
      else
        writeln('Nie');

to wychodzą mi całkowite głupoty na wyjściu. Weź to sprawdź.

0

@babubabu Program musi sprawdzić, czy zachodzi warunek na wszystkich elementach tablicy, a następnie wypisać. U ciebie sprawdza dwa sąsiednie i wypisuje dla nich. Wynik będzie poprawny tylko dla dwuelementowej tablicy.

0

@pawel24pl - pokaż może treści zadań, bo chyba łatwiej będzie napisać kod na spokojnie od początku, niż poprawiać to co już jest i nie działa prawidłowo.

0

Dodaje treści zadań, i jeszcze dodam coś co może być ważne, a czego wczoraj zapomniałem.
Na platformie zadania mają status "Błąd uruchomienia" (wszystkie 5 zadań na 50 testach każde),
co oznacza, że sie nie uruchamiają.
Wzrost pamięci w moich programach wzrasta po uruchomieniu, po wpisaniu danych, a nie
podczas uruchamiania.

0

@babubabu Szacowanie wielkości na tej podstawie jest dobre, jednak w przypadku zad5 wyjdzie 2*word+string, czyli 4 bajty + tekst do 150 znaków (w przypadku tego zadania), czyli niecałe 160B. Jest to mniej, niż 64MB. Jednak dlaczego to zadanie na wszystkich 50 testach ma błąd uruchomienia? Jak pisałem, wszystkie programy mają ten status z powodu uzasadnionego:

wyjście poza zakres tablicy, przekroczenie ilości pamięci.

Nie pasuje, bo tam nie ma tablic (pomijając, że na upartego "string" to "array of char"), ani wyjścia poza zakres pamięci.
Dlatego też chciałbym mieć nieco konkretniejsze liczby (+-1MB) do ewentualnego odwołania (no chyba, że sie totalnie mylę).

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