Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Θελω να μου πειτε εαν ξερετε τι μπορω να κανω για να βελτιστοποιησω ενα κωδικα σε C#. Φτιαχνω ενα παιχνιδι που εχει και σχεση με το cloud.

 

Ευχαριστω.

  • Απαντ. 39
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοσ.

Δε θα ειναι free. Θελω ο κωδικας να μεινει κλειστος. Εξαλου και να ηθελα ειναι λιγο μεγαλουτσικος.

Υπολογισε γυρω στα 500 MB+

Δημοσ.

Δεν υπαρχει!

Ανεπτυξα την δικη μου βασισμενος σε βιβλια που αγορασα και στο Ιντερνετ. Το εχω γραψει ολο απo το μηδεν σε DirectX 10.1.

Ο στοχος μου ειναι τα PC και το XBox πιο μετα. Το γραφω εδω και 1 χρονο και κατι μηνες. Αλλα πιστευω οτι θελει optimizations γι αυτο ρωταω.

 

Ιδεες;

Δημοσ.

Σε ευχαριστω πολυ. Ενδιαφεροντα αυτα αν και τα ξερω για το visual studio. Το προβλημα μου ειναι, ξεχασα να το διευκρινησω, οτι τα γραφω ολα σε notepad++ και τα τρεχω απο κονσολα. Οτι παραθυρο η γραφικο υπαρχει ειναι γραμμενο σε winAPI, C και μετα C++ για το DirectX.


Επειδη μπορει να σας μπερδψα, η C# κολει στο game και οχι στην μηχανη. Επίσης την γραφω σε κονσολα για την ιστορια  B)

  • Like 2
Δημοσ.

You're doing it the hard way ;)

Πολύ καλός text editor το notepad++, αλλά ένα πραγματικό IDE θα σε έκανε πολύ πιο αποδοτικό.

Το παν για ένα πρόγραμμα κατά τη γνώμη μου είναι η σωστή αρχιτεκτονική. Το optimization είναι το τελευταίο βήμα που γίνεται με τη βοήθεια εργαλείων και όχι με το μάτι.

 

Ερώτηση: Πώς ξέρεις ότι το πρόβλημα είναι στον C# κώδικα και όχι στη game engine πχ;

 

Νομίζω πως η χρήση ενός profiler τόσο για την engine όσο και για το game είναι επιβεβλημένη.. Δε θέλω να είμαι ισοπεδωτικός, αλλά το να αρχίσεις να βελτιστοποιείς ξεκάρφωτα μεθόδους επειδή έχεις την εντύπωση ότι εκεί χάνεται χρόνος είναι πρωτόγονο και απλά θα σε κάνει να χάσεις χρόνο από άλλα πιο σημαντικά πράγματα.

 

Δε θυμάμαι αν το είπα, αλλά νομίζω ότι πρέπει να χρησιμοποιήσεις profiling tools :-D

Δημοσ.

Εχω βελτιστοποιησει παρα πολυ το C/C++ κομματι μιας και γραφω 12 χρονια σε αυτες τις γλωσσες επαγγελματικα.

Στη C# ομως οχι. (Ενταξει και καποια πραγματα σε C++ για το DirectX). Ειμαι λοιπον σχεδον σιγουρος οτι τα προβληματα ειναι σε C#.

Δημοσ.

Για παραδειγμα στις C/C++ ξερουμε οτι στη μνημη η αποθηκευση/συσχετιση των πινακων γινεται με απλα μαθηματικα παν/μιου 1ου ετους, το "row major order".

 

Στη C# δεν εχω βρει αντιστοιχη πληροφορια. Σε αυτο που θα με βοηθησει για τα loops ξερει κανεις:;;;

Δημοσ.

Για παραδειγμα στις C/C++ ξερουμε οτι στη μνημη η αποθηκευση/συσχετιση των πινακων γινεται με απλα μαθηματικα παν/μιου 1ου ετους, το "row major order".

 

Στη C# δεν εχω βρει αντιστοιχη πληροφορια. Σε αυτο που θα με βοηθησει για τα loops ξερει κανεις:;;;

 

Γενικά βελτιστοποιήσεις που μπορείς να εφαρμόσεις είναι οι εξής:

 

- loop interchange

Βασίζεται σε αυτό που είπες.

 

- loop unrolling

for (int i = 0; i < 1000; i += 1)
        array[i] = 0;

# becomes

for (int i = 0; i < 1000; i += 5) {
        array[i] = 0;
        array[i+1] = 0;
        array[i+2] = 0;
        array[i+3] = 0;
        array[i+4] = 0;
}

# think what you will do when the iterations do not divide exactly with the unrolling level

Μειονέκτημα μπορεί είναι η αύξηση του μεγέθους του κώδικα. Επίσης παίζει να εξαντλήσεις τους καταχωρητές. Εδώ παίζεις με το βαθμό ξεδιπλώματος.

 

- loop invariant code motion

for (int i = 0; i < n; i++) {
        x = 5 + y;
        array[i] = x * x + i / 2;
}

# becomes

x = 5 + y;
temp = x * x;
for (int i = 0; i < n; i++) {
        array[i] = temp + i / 2;
}

- constant propagation

x = 9;
y = (x + 9) / x;

# becomes

x = 9;
y = 2; 

- loop fusion

int i, a[100], b[100];
for (i = 0; i < 100; i++)
        a[i] = 1;

for (i = 0; i < 100; i++)
        b[i] = 2;

# becomes

int i, a[100], b[100];
for (i = 0; i < 100; i++) {
        a[i] = 1;
        b[i] = 2;
} 

- function inlining

Είναι εύκολο να φανταστεί κανείς (όχι με το keyword). Μπορεί να οδήγήσει σε νέες βελτιστοποιήσεις.

 

- common subexpression elimination

a = b * c + g;
d = b * c * e;

# becomes

tmp = b * c;
a = tmp + g;
d = tmp * e;

- strength reduction

c = 8;
for (i = 0; i < N; i++) {
        y[i] = c * i;
}

# becomes

c = 8;
k = 0;
for (i = 0; i < N; i++) {
        y[i] = k;
        k = k + c;
}

- use of register, inline keywords, lookup tables for expensive functions, especially mathematic functions (log10, sqrt)

 

Είναι κι άλλες που μπορείς να κάνεις, οι οποίες είναι πιο εξειδικευμένες, ανάλογα τον compiler που χρησιμοποιείς.

Για παράδειγμα, αν χρησιμοποιείς πρόσφατη έκδοση gcc 4.x, η llvm ή clang, και ξέρεις πως δουλεύει το SSA θα μπορούσες

με κάποιο τρόπο να βοηθήσεις τον αλγόριθμο, κάνοντας στην ουσία κάποια δουλειά έτοιμη για τον compiler. Θα γλυτώσεις και χρόνο compiling, αλλά θα κερδίσεις πιο εύστοχες βελτιστοποιήσεις.

 

Σε όλες τις περιπτώσεις η ομορφία του κώδικα δεν υπολογίζεται. Επίσης κάποιες βελτιστοποιήσεις είναι δυνατό να μην προσφέρουν κάτι. Αντιθέτως μπορεί να αυξάνουν και τον χρόνο εκτέλεσης. Θέλει μελέτη πάνω στις επιλογές compiler και χρήση όσο το δυνατόν περισσότερων βελτιστοποιήσεων. Καλό θα ήταν να δοκίμαζες πολλούς compilers καθώς εμφανίζονται διαφορές ανάλογα με τον κώδικά σου. Επίσης όπως είπαν τα παιδιά πιο πάνω είναι απαραίτητη η χρήση profiler. Ειδικά για ένα τόσο μεγάλο project.

 

EDIT:

Επίσης οι caches θέλουν προσοχή ==> Valgrind.

  • Like 1
Δημοσ.

Αγαπητε φιλε μου σε ευχαριστω. Απο οτι φενεται ομως δε καταλαβες τι ειπα πιο πανω. Το ξαναγραφω:


Εχω βελτιστοποιησει παρα πολυ το C/C++ κομματι μιας και γραφω 12 χρονια σε αυτες τις γλωσσες επαγγελματικα.


Στη C# ομως οχι. (Ενταξει και καποια πραγματα σε C++ για το DirectX). Ειμαι λοιπον σχεδον σιγουρος οτι τα προβληματα ειναι σε C#.


 


Για την ακριβεια αυτα που αναφερεις ειναι λίγα σε σχεση με τα optimizations που εχω κανει. Επισης πιο πολυ αναφερονται σε C!


Μια παρατηριση εδω. Το Loop Unrolling που ανεφερες δεν ειναι και τοσο "έξυπνο" ουτε και η χρηση του "register" μιας και οι σημερινοι compilers αποφασιζουν καυτερα μονοι τους.


 


Τέλος, δε θελω να δοκιμασω αλλους compilers μιας και θελω να τρεχει μονο σε Windows 7/8.

Δημοσ.

 

Αγαπητε φιλε μου σε ευχαριστω. Απο οτι φενεται ομως δε καταλαβες τι ειπα πιο πανω. Το ξαναγραφω:

Εχω βελτιστοποιησει παρα πολυ το C/C++ κομματι μιας και γραφω 12 χρονια σε αυτες τις γλωσσες επαγγελματικα.

Στη C# ομως οχι. (Ενταξει και καποια πραγματα σε C++ για το DirectX). Ειμαι λοιπον σχεδον σιγουρος οτι τα προβληματα ειναι σε C#.

 

Για την ακριβεια αυτα που αναφερεις ειναι λίγα σε σχεση με τα optimizations που εχω κανει. Επισης πιο πολυ αναφερονται σε C!

Μια παρατηριση εδω. Το Loop Unrolling που ανεφερες δεν ειναι και τοσο "έξυπνο" ουτε και η χρηση του "register" μιας και οι σημερινοι compilers αποφασιζουν καυτερα μονοι τους.

 

Τέλος, δε θελω να δοκιμασω αλλους compilers μιας και θελω να τρεχει μονο σε Windows 7/8.

 

 

Και βέβαια το διάβασα. :) Απλά πιστεύω ότι αυτές μπορούν να γίνουν σε αρκετές γλώσσες προγραμματισμού, γιατί συνδέονται με την αρχιτεκτονική του επεξεργαστή. Συμφωνώ για το register. Το ίδιο συμβαίνει και με το inline. Tα ίδια και με το unrolling (τουλάχιστον για όσες δοκιμές έχω κάνει). Για αυτό που ρώτησες, φαντάζομαι χρειάζεσαι την περιγραφή της γλώσσας. Έψαξες για κάποιο βιβλίο που να έχει σχέση με βελτιστοποιήσεις πάνω σε C#; 

Δημοσ.

Ναι και θεωρω οτι ειναι πολυ φθηνα και με καθολου βαθος. Τα πιο σημαντικα "optimization" που ανεφεραν ηταν να μη σηκωνω μεγαλα συνολα απο NoSQL στη μνημη (LOL - φοβερο και τρομερο και καθολου αυτονοητο - ξανα LOL), και να μη κανω πολλα loops (αλλα να μη πολυφοβαμαι γιατι θα με τακτοποησει η .ΝΕΤ - Μας κοροϊδευει ετσι?  ;)).

 

..και μεσα σε πολλα αλλα που ελεγε, εγω λεω: Τρεχα γυρευε...

 

Αρα, πολυ φθηνα και με καθολου βαθος!!!!!


Α!!! και το αστειο για να μη το ξεχασω, ουτε καν αναφορα σε pointers στα βιβλια. Ειναι λεει evil :devil: οι pointers και στη C# μπορεις να βρεις αλλους τρόπους γιατι δε σου πολυ χρειαζονται, ειναι και unsafe........ Δικο μου προβλημα ρε μεγαλε. Θα τους κανω safe!

 

Υ.Γ: Εδω ειναι που χτυπαγα το κεφαλι μου με σφυρι!

 

Γι αυτο ρωταω απελπισμενα. Ξερει κανεις καλες πρακτικες σε C#?

  • Like 1
Δημοσ.

Εφόσον έχεις βελτιστοποιήσει τη μηχανή (C και τα μυαλά στα κάγκελα)  γιατί θεωρείς τόσο κρίσιμο να ξεζουμίσεις και το front-end που γράφεις σε C#?

 

Έχεις σκεφτεί να γράψεις σε C/C++ όποια σημεία του front-end θεωρείς τόσο κρίσιμα (θεωρώ πως δεν θα είναι και πολλά), και τα υπόλοιπα να τα αφήσεις σε C# με ότι conventional optimizations σου δίνει ο compiler σου;

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...