Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Matt91111

[C] Problem z pomiarem czassu

Rekomendowane odpowiedzi

Potrzebuje zmierzyć czas sortowania tablic.

Z tego co wiem wynika, że to powinno wyświetlić czas w sekundach, a to są co najwyżej ms, ale co do tego pewności też nie mam :hmm:

  printf("%lu s \n", (czas_selectionSort/CLOCKS_PER_SEC) );

 

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>

#define NUMBER_OF_ELEMENTS 10000

#define __forceinline __attribute__((always_inline))
int __forceinline losoj_wartosc(int min, int max) {
   int r = (rand() % (max + 1 - min)) + min; //losujemy liczbe z przedzialu
   return r;
}

void selection_sort(int array[]);//sortowanie przez wybor
void swap(int *first, int *second);
void wypelnij_tablice(int tablica[]);

int main()
{
  int tablica[NUMBER_OF_ELEMENTS];
  wypelnij_tablice(tablica);

  time_t selectionSort = clock();
  selection_sort(tablica);

  double czas_selectionSort = (selectionSort - clock());

  printf("%lu s \n", (czas_selectionSort/CLOCKS_PER_SEC) );
  printf("%lu s \n", czas_selectionSort );

  return 0;
}

void wypelnij_tablice(int tablica[]) {
  int i;
  for(i=0; i < NUMBER_OF_ELEMENTS; i++) {
     losoj_wartosc(-10000, 10000);
  }
}

void swap(int *first, int *second)
{
  if(first == second)
     return;

  *first ^= *second;
  *second ^= *first;
  *first ^= *second;
}

void selection_sort(int array[])
{
  int i,j;

  for(i=0; i<NUMBER_OF_ELEMENTS-1; i++) {
     int min = i;

     for(j=i+1; j<NUMBER_OF_ELEMENTS; j++)
        if(array[min]>array[j])
           min = j;
        if(min!=i)
           swap(&array[min],&array[i]);
  }
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

dlaczego czas_selectionSort masz typu double? spróbuj uint32_t

 

a tak w ogóle to raczej poszedłbym coś w stylu

 

auto start = std::chrono::high_resolution_clock::now();

selection_sort(tablica);

auto elapsed = std::chrono::high_resolution_clock::now() - start;

 

btw mieszasz angielskie nazwy z polskimi

 

aha i 10000 elementów to raczej za mało. Mógłbyś dodać opóźnienia w każdym przebiegu pętli albo w operacji zamiany wartości bo inaczej pomiary będą niemiarodajne

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

@up

Autor pisze w C, dlatego cywilizowane formy odpadają ;)

 

 

Autorze, jesteś pewien, że

selectionSort - clock()

taka arytmetyka jest poprawna? ;)

 

I.. e... warningi.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Autorze, jesteś pewien, że

selectionSort - clock()

taka arytmetyka jest poprawna? ;)

No właśnie po poprawieniu ciągu formatującego wyniki wyszły na - :E

 

aha i 10000 elementów to raczej za mało. Mógłbyś dodać opóźnienia w każdym przebiegu pętli albo w operacji zamiany wartości bo inaczej pomiary będą niemiarodajne

Wszystkie typy sortowania będą korzystały z tej samej funkcji swap, będą miały taki sam rozmiar więc czemu wyniki miały by być niemiarodajne :hmm: btw zwiększę ilość elementów do posortowania.

 

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>

#define NUMBER_OF_ELEMENTS 10000

#define __forceinline __attribute__((always_inline))
int __forceinline losoj_wartosc(int min, int max) {
   int r = (rand() % (max + 1 - min)) + min; //losujemy liczbe z przedzialu
   return r;
}

void selection_sort(int array[]);//sortowanie przez wybor
void swap(int *first, int *second);
void wypelnij_tablice(int tablica[]);

int main()
{
  int tablica[NUMBER_OF_ELEMENTS];
  wypelnij_tablice(tablica);

  time_t selectionSort = clock();
  selection_sort(tablica);

  //double czas_selectionSort = (selectionSort - clock());
  double czas_selectionSort = clock() - selectionSort;
//   uint32_t = u_czas_selectionSort = selectionSort - (clock());

  printf("%.2lf s \n", (czas_selectionSort/CLOCKS_PER_SEC) );
  //printf("%lf s \n", czas_selectionSort );

  return 0;
}

void wypelnij_tablice(int tablica[]) {
  int i;
  for(i=0; i < NUMBER_OF_ELEMENTS; i++) {
     losoj_wartosc(-10000, 10000);
  }
}

void swap(int *first, int *second)
{
  if(first == second)
     return;

  *first ^= *second;
  *second ^= *first;
  *first ^= *second;
}

void selection_sort(int array[])
{
  int i,j;

  for(i=0; i<NUMBER_OF_ELEMENTS-1; i++) {
     int min = i;

     for(j=i+1; j<NUMBER_OF_ELEMENTS; j++)
        if(array[min]>array[j])
           min = j;
        if(min!=i)
           swap(&array[min],&array[i]);
  }
}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

ooo - tylko jeden warning - robisz progres :E

 

widzę, że niektórzy dalej wierzą w lepszość xorswapa or tradycyjnego rozwiązania ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

ooo - tylko jeden warning - robisz progres :E

 

widzę, że niektórzy dalej wierzą w lepszość xorswapa or tradycyjnego rozwiązania ;)

Nie pamiętałem, jak się biblioteka nazywała do swapa a akurat miałem pdfa otwartego z czudem. :E

 

Ejj ejj ale ja żadnego warna nie mam (-Wall) :hmm:

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mi jedyne co gcc wypisuje to ostrzeżenie, że "losoj_wartosc" może nie zostać inline'owane.

 

Za to visual (po wykomentowaniu _forceinline) z /W4 wypluwa dwa, z czego drugi... zresztą sam zobacz :lol2:

a.c(27) : warning C4244: 'initializing' : conversion from 'time_t' to 'double', possible loss of data

a.c(36) : warning C4100: 'tablica' : unreferenced formal parameter

36 to początek metody wypelnij_tablice ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mi jedyne co gcc wypisuje to ostrzeżenie, że "losoj_wartosc" może nie zostać inline'owane.

 

Za to visual (po wykomentowaniu _forceinline) z /W4 wypluwa dwa, z czego drugi... zresztą sam zobacz :lol2:

 

36 to początek metody wypelnij_tablice ;)

Aj tam visual. Jak w visualu bd pisał to tam osobno trzeba będzie warny ogarnąć. Z tym że w visualu __forceinline już jest zdefiniowane i spełnia swoje działania a redefinicja raczej nie poprawi sytuacji.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Czyli chcesz powiedzieć że te warningi od visuala można zlać? :E

Warningi często wskazują sytuacje co do których jest wysokie prawdopodobieństwo, że programista popełnił błąd. Najlepsze jest to, że komunikaty od różnych kompilatorów są tak samo sensowne, i warto ten sam kod kompilować na różnych kompilatorach, bo dzięki temu dostanie się więcej wartościowych informacji o miejscach, które mogą być błędne.

 

Okej, pierwszy faktycznie można czasem zignorować, ale drugi... Przeczytaj jego treść, a następnie patrz się na swoją funkcję "wypelnij_tablice" tak długo, aż nie zaliczysz srogiego facepalm'a ;)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...