Prawdopodobieństwo pominięcia operacji

0

Mam takie głupie pytanie. Czy istnieje teoretycznie ryzyko, że jeśli program napisany w C# będzie wykonywał bardzo długotrwałą i skomplikowaną operację (np. wiele tysięcy razy w pętli operować na bardzo rozbudowanych zbiorach danych składających się z wielu obiektów różnych klas, przy pomocy funkcji które w swych ciałach wywołują inne funkcje które w swych ciałach też wywołują funkcje etc.) to potencjalnie może pominąć sporą część roboty? Np. wykona tylko 40% a będzie się zachowywał jakby zrobił całość, pomimo że podejrzanie szybko skończył a wynik jest niższy niż powinien być po wykonaniu 100%? Np. dla każdego z wielu obiektów powinien teoretycznie obliczyć jakiś współczynnik i to wszystko zsumować, a w praktyce część obiektów sobie po prostu ominie? Czy raczej nie ma na jakość wyników żadnego wpływu jak długo program działał i ile gigabajtów przetworzył?

3

Obawiam się że nie ma takiej możliwości.

Jeśli masz konkretne podejrzenia do dziwnie zachowującego się fragmentu kodu (tzn. podejrzanie szybko kończącego) - jeśli nigdzie nie zapisujesz efektów tej pracy, być może padasz ofiarą optymalizacji kompilatora.

Np. jeśli napiszesz taki kod:

void Test() {
    int sum = 0;
    for (int i = 0; i < 1000000; i++) { sum += i; }
}

Możesz myśleć że 1000000 zostanie wykonane dodawanie liczb całkowitych. Nie będzie tak, optymalizator zorientuje się że nigdzie nie używasz sumy i usunie niepotrzebne operacje (tyle przynajmniej pamiętam z moich zabaw z JITem (x86 i x64) - z drugiej strony, JIT nie umie modyfikować przepływu programu, więc w kodzie wynikowym zostanie pętla for - pusta).
Sposób na rozwiązanie tego jest prosty, musisz gdzieś tej sumy użyć.

Inna opcja to użycie operacji LINQ (które w większości działają leniwie) na dużym zbiorze danych i wykorzystanie tylko części wyniku (albo i nie wykorzystanie niczego).

To taka spekulacja, krótka odpowiedź brzmi (jeszcze raz): nie.

PS. Programy robią dokładnie to samo co /Ty/ mu kazałeś, raczej bym od tego zaczął poszukiwania błędu.

0

Dodatkowo, aby zapewnić by takie błędy nie występowały jak nie obsługiwane obiekty, to są robione testy wydajnościowe - musisz sprawdzić kiedy występuje błąd, przy jakis wielkościach zmiennych itp. Czyli zostaje analiza i debugowanie.

Na początek sprawdź najbardziej wrażliwe punkty na błąd, jakieś warunki, pętle.

0
msm napisał(a):

To taka spekulacja, krótka odpowiedź brzmi (jeszcze raz): nie.

No to dzięki za rozwianie wątpliwości, w sumie to jestem pewien że program działa prawidłowo (każdy krok ostrożnie sprawdzałem zmienna po zmiennej, a testy robiłem na razie tylko dla kilku próbek wybranych losowo więc wyniki mogły być różne), po prostu byłem nieco podejrzliwy, bo podobny program z którym porównywałem ten mój działał duuużo wolniej dla tych samych parametrów, ale w sumie to tamten był napisany bardzo nieintuicyjnie i nieoptymalnie - dla n obiektów złożoność przeszukiwania ich była kwadratowa a u mnie jest liniowa, do tego po każdym z kilkuset testów wgrywał wszystkie obiekty z pliku na nowo gdy tymczasem u mnie przywraca poprzednie wartości zmienionych pól etc. ;)

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