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ł?

- Rejestracja:prawie 16 lat
- Ostatnio:4 miesiące
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.

- Rejestracja:ponad 12 lat
- Ostatnio:ponad rok
- Postów:490
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.

- Rejestracja:prawie 12 lat
- Ostatnio:ponad 10 lat
- Postów:30
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. ;)