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

C or Python?


KillBill93

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

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

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

Εξαρτάται από του πού δουλεύεις και για τι δουλειές ψάχνεις. Επειδή στην Ελλάδα είναι έτσι τα πράγματα δε πάει να πει ότι είναι παντού. Επίσης μερικοί άνθρωποι ασχολούνται και με το open source development.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Εξαρτάται από του πού δουλεύεις και για τι δουλειές ψάχνεις. Επειδή στην Ελλάδα είναι έτσι τα πράγματα δε πάει να πει ότι είναι παντού. Επίσης μερικοί άνθρωποι ασχολούνται και με το open source development.

 

Αβέρτα open source - no problem... Αλλά πιστεύω ότι αν ψάξεις τα trends μάλλον και από open source όλο και λιγότερα projects τρέχουν σε C. Ουσιαστικά για να είμαστε ειλικρινείς Ο ΜΟΝΟΣ ισχυρός λόγος για να χρησιμοποιήσεις C σήμερα δεν είναι ούτε καν performance αλλά μόνο αν η εφαρμογή σου έχει Hard Real Time Constraints π.χ. drivers χαμηλού επιπέδου, network πράγματα, οτιδήποτε ρομποτικό, high-frequency trading κ.τ.λ. Η αχίλλειος πτέρνα κάθε τι πάνω από την C/C++ λέγεται Garbage collector

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Έχω μια "ύποπτη" ταύτιση με τον Erevis, ρε μπας και είμαστε τίποτα συγγενείς; :lol:

 

@neverlastn:

 

Ω ναί... δεν αμφιβάλω... μπορείς να αλλάξεις και την stdlib αν θέλεις και με λίγο hack στον gcc να βάλεις 4/8 bytes padding στην αρχή κάθε const char *. Αλλά γιατί να αφιερώσω αυτά τα 20 λεπτά να φτιάξω τη δομή που λες; Παρεπιπτόντως με το που αρχίζεις τις δομές string αν δεν θέλεις να γίνει πολύ ugly ο κώδικας καλύτερα να πας κατευθείαν σε C++ και std::string.

Όπως σου είπα, δεν χρειάζεται να κάνεις σχεδόν τίποτα μόνος σου, υπάρχουν έτοιμες (μη στάνταρ) βιβλιοθήκες για σχεδόν οτιδήποτε, οι οποίες ακόμα κι on-demand μια-μια να τις μαθαίνεις δεν θα σπαταλήσεις και πολύ περισσότερο χρόνο από ότι να μάθεις μια καινούρια γλώσσα. Αλλά ίσως χρειαστεί να τις κάνεις re-compile αν αλλάξεις πλατφόρμα. Επίσης, οι δομές γενικότερα (και όχι μόνο για strings) ομορφαίνουν τον κώδικα, δεν τον ασχημαίνουν :)

 

Τι το άσχημο υπάρχει π.χ. εδώ: http://developer.gnome.org/glib/2.28/glib-Strings.html#GString;

 

Το ζουμί πάντως δεν είναι αυτό, το ζουμί είναι πως σχεδόν όλες οι γλώσσες μπορούν να κάνουν σχεδόν τα πάντα, αλλά "εξειδικεύονται" σε πολύ λιγότερους τομείς η κάθε μια τους (συγκριτικά με το "πάντα"). Για αυτό (όπως έχω γράψει και σε άλλο νήμα) η καλύτερη γλώσσα από όλες είναι... τα bindings :)

 

Πολύ sick - respect!!

Τι respect ρε συ; Ένα κωδικοπαίγνιο έκανα (κατά το "λογοπαίγνιο" :lol:) ... αν παρέδιδες αυτόν τον κώδικα στον supervisor σου σε ένα team-project μάλλον θα σε... απέλυε :lol:

 

Δυο ακόμα σημειώσεις αν μου επιτρέπεις, πρώτα πως κατά την άποψή μου η C δεν διδάσκεται σχεδόν ανεξαιρέτως επειδή με αυτήν μπορείς να κάνεις τα πάντα, αλλά επειδή αναγκάζεσαι να μάθεις το παρασκήνιο σε μεγάλο βάθος όταν προγραμματίζεις με αυτήν.

 

Το άλλο είναι πως δείχνεις να βασίζεις τις κρίσεις και τις επισημάνσεις σου στην εγχώρια αγορά, η οποία όπως όλοι γνωρίζουμε είναι ο κοντύτερος από όλους τους... νάνους της πληροφορικής σε επίπεδο αγοράς (δεν μιλάμε καν για μετρίου αναστήματος, ψηλούς ή γίγαντες :lol:).

Η πληροφορική όμως είναι από τους κλάδους που ενδεικνύονται για παγκοσμιοποιημένη επαγγελματική αποκατάσταση, και σε επίπεδο ανώτατης εκπαίδευσης δεν είμαστε και τόσο χάλια στην Ελλάδα, το αντίθετο θα έλεγα.

 

Εννοώ πως πάντα κατά την άποψή μου, δεν είναι σοφό να χαμηλώνουμε τόσο πολύ τον πήχη στις αξιολογήσεις και τις κρίσεις που κάνουμε ;)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

μια-μια να τις μαθαίνεις δεν θα σπαταλήσεις και πολύ περισσότερο χρόνο από ότι να μάθεις μια καινούρια γλώσσα.

 

Μα η python παίρνει max μια μέρα - try this at home!

 

Επίσης, οι δομές γενικότερα (και όχι μόνο για strings) ομορφαίνουν τον κώδικα, δεν τον ασχημαίνουν :)

 

Από το...

 

char * a = "hi";

int len = strlen(a);

 

στο

 

my_str * a = my_str_init("hi");

int len = my_str_len(a);

my_str_free(&a);

 

εγώ προτιμώ το πρώτο! :)

 

Τι το άσχημο υπάρχει π.χ. εδώ: http://developer.gnome.org/glib/2.28/glib-Strings.html#GString;

 

Μπλιάχ... δε βλέπεται! (Sorry αν την έγραψες εσύ - just kidding). Χρειάζομαι ειδικά γυαλιά για να g_διαβάσω g_αυτόν g_τον(g_κώδικα). Το πρόβλημα είναι αυτό.

 

αν παρέδιδες αυτόν τον κώδικα στον supervisor σου σε ένα team-project μάλλον θα σε... απέλυε :lol:

 

:P Χαχαχα... σιγά μη καθόταν να το διαβάσει. Θα έκανε stack overflow μετά από 2 δευτερόλεπτα.

 

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

 

Πολύ σωστό.

 

Το άλλο είναι πως δείχνεις να βασίζεις τις κρίσεις και τις επισημάνσεις σου στην εγχώρια αγορά, η οποία όπως όλοι γνωρίζουμε είναι ο κοντύτερος από όλους τους... νάνους της πληροφορικής σε επίπεδο αγοράς (δεν μιλάμε καν για μετρίου αναστήματος, ψηλούς ή γίγαντες :lol:).

Η πληροφορική όμως είναι από τους κλάδους που ενδεικνύονται για παγκοσμιοποιημένη επαγγελματική αποκατάσταση, και σε επίπεδο ανώτατης εκπαίδευσης δεν είμαστε και τόσο χάλια στην Ελλάδα, το αντίθετο θα έλεγα.

 

Εννοώ πως πάντα κατά την άποψή μου, δεν είναι σοφό να χαμηλώνουμε τόσο πολύ τον πήχη στις αξιολογήσεις και τις κρίσεις που κάνουμε ;)

 

Όχι ρε συ... τουναντίον! Μακάρι η Ελληνική αγορά να ήταν σε τέτοιο επίπεδο. Ζήτημα αν 5 εταιρίες στην Ελλάδα χρησιμοποιούν AWS (και το ξέρουν) ή αν υπάρχουν 100 developers που κάνουν node και έχουν χρησιμοποιήσει redis. Για την Ελληνική αγορά Visual Basic και php και ASP είναι μιά χαρα. MS SQL Server, Access, λίγη Java... άντε κι ένα memcached για να το κάψουμε!!

 

Η εκπαίδευση είναι σε καταπληκτικό επίπεδο σε σχέση με εξωτερικό - σίγουρα. Τα ΤΕΙ είναι ΑΕΙ του εξωτερικού και τα ΑΕΙ είναι Master+ από επίπεδο προγράμματος σπουδών. Το μόνο πρόβλημα είναι ότι δεν ξεχωρίζουν πλέον τι είναι σημαντικό και τι όχι. Τα περισσότερα προγράμματα είναι υπερφορτωμένα λόγω του φόβου της *** μπουυυυυ *** αγοράς. Ας μάθουμε στα παιδιά τα πάντα - όλο και κάτι θα πιάσουν... Το κακό είναι ότι τώρα λοιπόν που τα προγράμματα σπουδούν έχουν 3x τα μαθήματα που θα έπρεπε να έχουν, ούτε οι καθηγητές ούτε οι φοιτητές έχουν τον χρόνο να κάτσουν να εμβαθύνουν σε ένα - οπότε γίνεται ένα γενικό πασάλειμα. Οι καλοί θα τα πιάσουν αλλά οι μέσοι θα χρειαστεί να αντιγράψουν :( Και that's all όλοι φαίνονται ωραίοι... οι καθηγητές, οι φοιτητές και τα προγράμματα... αλλά όταν έρχεται η ώρα να σφίξουν τα ζωνάρια... ουπς!! Από που μας ήρθε αυτό; Πάντως το επίπεδο είναι πολύ ψηλο.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Νομίζω ότι όλο το "ζουμί" (κατά την δική μου άποψη) το έδωσε ο never σε μία πρόταση, άσχετα εάν δεν στάθηκε σε αυτή:

 

Μη συγκρίνετε γλώσσες σε λάθος βάση

 

 

Έτσι, μία χαρά θα ζητηθεί και η C, εάν το project το απαιτεί αλλά και η Python, και η Java, και η C++, C# και και και.

Ακόμα και Objective C (Apple fan γαρ :P ).

 

 

Έτσι, το ερώτημα C ή Python μπορεί να απαντηθεί εάν δοθεί η απάντηση στην ερώτηση:

 

-Για τι εφαρμογή;

 

Δεν διαφωνώ στο ότι με "low level" γλώσσες μπορεί κανείς να μάθει τι γίνεται εσωτερικά στο μηχάνημα όταν του λέει να φτιάξει ένα πίνακα... αλλά το θέμα είναι πώς, πότε και πόσο συχνά θα του χρειαστεί αυτή η γνώση.

 

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

 

Εάν ασχοληθεί με embedded, τότε θα του χρησιμεύσει και, εάν έχει εμπειρία, με λίγο διάβασμα φρεσκάρει τις γνώσεις του και προχωράει.

 

 

Από όλα αυτά... θα κρατήσω την προσπάθεια να "make a point" του never, αναφερόμενος στην πολυπλοκότητα...

 

Όχι γιατί θέλω να τον κρίνω (ίσα - ίσα που συμφωνώ αρκετά μαζί του σε πολλά σημεία), αλλά γιατί πιστεύω ότι το θέμα δεν είναι τι γλώσσα αλλά τι design και δόμηση θα κάνεις στον "κώδικα" μαζί με τι είδους documentation θα προσφέρεις, ανεξαρτήτως, όσο γίνεται, από την γλώσσα που θα χρησιμοποιήσεις.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν διαφωνώ στο ότι με "low level" γλώσσες μπορεί κανείς να μάθει τι γίνεται εσωτερικά στο μηχάνημα όταν του λέει να φτιάξει ένα πίνακα... αλλά το θέμα είναι πώς, πότε και πόσο συχνά θα του χρειαστεί αυτή η γνώση.

 

Τελικα ειμαι ο μονος που διαφωνω σε αυτο shock.png happy.gif

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Παιδια καλησπερες!!! Μπορειτε να μου λυσετε μια απορια; Τι δυνατοτητες εχει η Python και τι η C; Και ποια προτεινετε?

 

Αν θες να μιλάς πολύ με hardware τότε C για ΟΤΙΔΗΠΟΤΕ άλλο τότε Python, μια όμορφη, γρήγορη γλώσσα (PyPy, Cython) με τεράστια κοινότητα και δυνατότητες που ξεπερνούν όποια απαίτηση!

Web programming, mobile programming, arduino, maths, scripts, desktop apps, scientific κάνεις τα πάντα χωρίς τους πόνους της C.

 

Τώρα αυτά για την ταχύτητα είναι αστειότητες, δε σου χρειαστεί πότε η ταχύτητα της C αλλά θες ταχύτητα στο development και να λύνεις γρήγορα και αποτελεσματικά τα προβλήματα που θες. Αν θες ταχύτητα τότε δες τη Cython και PyPy

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αν θες να μιλάς πολύ με hardware τότε C για ΟΤΙΔΗΠΟΤΕ άλλο τότε Python, μια όμορφη, γρήγορη γλώσσα (PyPy, Cython) με τεράστια κοινότητα και δυνατότητες που ξεπερνούν όποια απαίτηση!

Web programming, mobile programming, arduino, maths, scripts, desktop apps, scientific κάνεις τα πάντα χωρίς τους πόνους της C.

 

Τώρα αυτά για την ταχύτητα είναι αστειότητες, δε σου χρειαστεί πότε η ταχύτητα της C αλλά θες ταχύτητα στο development και να λύνεις γρήγορα και αποτελεσματικά τα προβλήματα που θες. Αν θες ταχύτητα τότε δες τη Cython και PyPy

 

Πες τα ρε χρυσοστομε!! Το μονο αντιληπτο αναμεσα σε LL και HL ειναι το startup με το δευτερο να θελει 0.1 ~ 2sec για να παρει μπρος ο interpreter, αντε και σε ελαχιστες περιπτωσεις να υπαρχει ενα πιο αισθητο flickering οταν εχουμε UI.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μα η python παίρνει max μια μέρα - try this at home!

Κάτι έχω κάνει try κι εγώ :P

 

Από το...

>
char * a = "hi";
int len = strlen(a);

 

στο

>
my_str * a = my_str_init("hi");
int len = my_str_len(a);
my_str_free(&a);

 

εγώ προτιμώ το πρώτο! :)

 

Μπλιάχ... δε βλέπεται! (Sorry αν την έγραψες εσύ - just kidding). Χρειάζομαι ειδικά γυαλιά για να g_διαβάσω g_αυτόν g_τον(g_κώδικα). Το πρόβλημα είναι αυτό.

Τώρα να σου πω την αλήθεια μου, κι επειδή με παρέμπεψες σε C++ για όμορφο κώδικα, προσωπικά δεν βλέπω κάποια ουσιαστική διαφορά σε ομορφιά μεταξύ π.χ. αυτού...

>
int main( void )
{
 string str ("Test string");

 cout << "The size of str is " << str.size() << " bytes.\n";
 cout << "The length of str is " << str.length() << " bytes.\n";

 return 0;
}

και αυτού...

>
int main( void )
{
String *s = str_new("Test string");

printf("The size of str is %lld bytes\n", s->size );
printf("The length of str is %lld bytes\n", s->length );

str_delete( s );
return 0;
}

ή αυτού...

>
int main( void )
{
String *s = str_new("Test string");

printf("The size of str is %lld bytes\n", str_size(s) );
printf("The length of str is %lld bytes\n", str_length(s) );

str_delete( s );
return 0;
}

με τα παρακάτω ορισμένα σε ξεχωριστό source module στη C και τεκμηριωμένα ως προς τη χρήση τους για τον προγραμματιστή που δεν χρειάζεται καν να έχει πρόσβαση στον κώδικα αυτού του module.

>
typedef struct string {
size_t length, size;
char *data;
}String;

// ----------------------------------------------------------------------------------
String *str_new( const char *cstring )
{
String *str;
char *cp = NULL;

str = calloc( 1, sizeof( String ) );
if ( !str )
	return NULL;

str->length = str->size = 0;

if ( !cstring ) {
	str->data = calloc( 1, sizeof(char) );
	if ( !str->data )
		return NULL;
	str->size = 1;
	return NULL;
}

str->size = strlen( cstring ) + 1;
str->data = calloc( str->size, sizeof(char) );
if ( !str->data ) {
	str->length = str->size = 0;
	return NULL;
}

str->length = str->size-1;
for (cp=str->data; (*cp = *cstring); cp++, cstring++ )
	;

return str;
}
// ----------------------------------------------------------------------------------
size_t str_size( const String *str )
{
return str && str->data ? str->size : 0;
}
// ----------------------------------------------------------------------------------
size_t str_len( const String *str )
{
return str && str->data ? str->length : 0;
}
// ----------------------------------------------------------------------------------
void str_delete( String *str )
{
str->length = str->size = 0;

if ( str->data )
	free( str->data );

if ( str )
	free( str );

return;
}

κι επειδή αν δεις στον κώδικα, το πεδίο data είναι κανονικό cstring, άρα το πεδίο len αντιστοιχεί σε strlen() και το size σε sizeof, μπορείς ελεύθερα να διαχειριστείς το data απευθείας με τις στάνταρ συναρτήσεις, όταν η διαχείριση π.χ. δεν προϋποθέτει αλλαγή των length και size (π.χ. να συγκρίνεις λεξικογραφικά τα String s1, s2; Προφανώς και πρέπει να φτιάξεις συναρτήσεις διαχείρισης για τη δομή String, αλλά τουλάχιστον αν τις φτιάξεις σωστά και με ασφαλή τρόπο και τις κάνεις μια μικρή βιβλιοθηκούλα, τότε θα τις χρησιμοποιείς μελλοντικά σε οποιδήποτε άλλο πρόγραμμα χωρίς να τις ξαναγράφεις (εναλλακτικά μπορείς να χρησιμοποιήσεις έτοιμες βιβλιοθήκες, που έχουν φτιάξει άλλοι).

 

Να μου πεις πως στη C++ τα πράγματα γίνονται πολύ πιο εύκολα και πιο ασφαλή, τότε ναι να συμφωνήσω... όχι όμως ότι είναι πιο όμορφος ο κώδικας επειδή χρησιμοποιείς έτοιμες δομές & χαρακτηριστικά της γλώσσας, αντί για manually made δικά σου :lol: Αν γράφεις γενικώς άσχημο κώδικα, ε τότε άσχημος θα είναι κι ο εκάστοτε επι μέρους κώδικάς σου :lol:

 

ΥΓ. Επειδή έχω ψυχανεμιστεί πως πρέπει να δικαιολογούμαστε όταν γράφουμε κώδικα σε αυτό το φόρουμ αλλιώς κινδυνεύουμε να κατηγορηθούμε πως "πουλάμε μούρη" να πω πως τον παραπάνω κώδικα τον έγραψα για να στηρίξω την επιχειρηματολογία μου. Και συγκεκριμένα πως σχεδόν όλες οι γλώσσες μπορούν να κάνουν σχεδόν τα πάντα. Το ότι κάθε γλώσσα είναι περισσότερο ή λιγότερο κατάλληλη για συγκεκριμένες δουλειές είναι αυτονόητο, πλην όμως πολύ συχνά δεν είναι και τόσο αυτονόητο όσο ενδεχομένως νομίζει κανείς. Π.χ. όποιος ήδη ξέρει μια-δυο γλώσσες καλά και έχει φτιάξει και δικές του βιβλιοθήκες ή έχει μάθει να χρησιμοποιεί δημοφιλείς (στάνταρ ή μη) βιβλιοθήκες, δεν έχει και κάνα σοβαρό λόγο να αλλάξει γλώσσα μόνο και μόνο επειδή έτσι είναι το... trend ή επειδή έτσι του λένε να κάνει οι άλλοι.

 

Έδωσα και το παράδειγμα της glib (και με link) και δεν το έκανα τυχαία. Αν κάποιος έχει μάθει να τη χρησιμοποιεί, τότε είναι κατά τομείς εξίσου παραγωγικός με κάποιον που προγραμματίζει π.χ. σε Python, κάτι που προφανώς δεν είναι όποιος δεν έχει ξανά χρησιμοποιήσει την glib.

 

Προφανώς και υπάρχουν γλώσσες που παρέχουν σοβαρά κίνητρα για να μεταπηδήσει κανείς, μιας και η ζωή εξελίσσεται (π.χ. αν το το project είναι σχεδιασμένο για OOP προφανώς και δεν θα είναι η C η πρώτη σου επιλογή).

 

Αλλά τα πράγματα δεν είναι τόσο απόλυτα όσο πολύ συχνά παρουσιάζονται.

 

..

Τώρα αυτά για την ταχύτητα είναι αστειότητες, δε σου χρειαστεί πότε η ταχύτητα της C αλλά θες ταχύτητα στο development και να λύνεις γρήγορα και αποτελεσματικά τα προβλήματα που θες. Αν θες ταχύτητα τότε δες τη Cython και PyPy

Να υποθέσω τότε πως πρέπει να πετάξουμε στα σκουπίδια πανεπιστήμια και τη μισή βιβλιογραφία της πληροφορικής που ασχολούνται με κάτι... αστειότητες τύπου computational complexity, algorthmic analysis και συναφείς... αηδίες! Και btw, αν χρειαστείτε ποτέ sorting, μόνο bubble-sort... ταχύτητα στο development και κάνει και τη δουλειά που θέλουμε! :P

 

ΥΓ. Τι άλλο θα ακούσουμε ρε παιδιά, έλεος!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Να υποθέσω τότε πως πρέπει να πετάξουμε στα σκουπίδια πανεπιστήμια και τη μισή βιβλιογραφία της πληροφορικής που ασχολούνται με κάτι... αστειότητες τύπου computational complexity, algorthmic analysis και συναφείς... αηδίες! Και btw, αν χρειαστείτε ποτέ sorting, μόνο bubble-sort... ταχύτητα στο development και κάνει και τη δουλειά που θέλουμε! :P

 

ΥΓ. Τι άλλο θα ακούσουμε ρε παιδιά, έλεος!

 

confused.png Ωρες ωρες αναρωτιεμαι... "Εισαι ή δεν εισαι τρολ". Δηλαδη κατα τη γνωμη σου, μια function qsort γραμμενει σε JavaScript δεν ειναι qsort αλλα bubble sort; Ή θελεις να μου πεις οτι τα frameworks που εχουν οι HL γλωσσες, χρησιμοποιουν εκπαιδευτικους αλγοριθμους;

 

BTW: Για το κωδικα που παραθατεις. Αντι να εχει μια δομη, γιατι δεν κανεις ενα απλο padding; Αν και προσωπικα δεν βλεπω το λογο να μπεις στο κοπο να φτιαξεις κατι τετοιο εφοσον στις περισσοτερες περιπτωσεις το strlen ειναι αχρηστο.

 

Performance...

>using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
   class Program
   {
       [DllImport(
           "sort.dll",
           CallingConvention = CallingConvention.Cdecl,
           EntryPoint = "Sort")]
       public static extern void qsortc(IntPtr arr, int len);

       static int[] MakeMeBigRandomArray()
       {
           int[] arr = new int[1024 * 1024 * 10];
           Random rand = new Random();
           for (int i = 0; i < arr.Length; i++)
           {
               arr[i] = rand.Next();
           }
           return arr;
       }
       static void Main(string[] args)
       {
           int[] arr = MakeMeBigRandomArray();
           int[] arr1 = new int[arr.Length];
           Array.Copy(arr, arr1, arr.Length);
           long start,end;
           
           unsafe
           {
               fixed (int* pInt = arr)
               {
                   start = DateTime.Now.Ticks;
                   qsortc((IntPtr)pInt, arr.Length);
                   end = DateTime.Now.Ticks;
                   Console.WriteLine("C qsort:\t{0}ticks",end-start);
               }
           }
           start = DateTime.Now.Ticks;
           Array.Sort(arr1);
           end = DateTime.Now.Ticks;
           Console.WriteLine("C# sorting:\t{0}ticks",end - start);
           Console.Read();
       }
   }
}

 

output....

>C qsort:        29711699ticks
C# sorting:     13660781ticks

 

Να πω την αληθια, εξεπλαγην.

csort (qsort)

>#include "stdafx.h"
#include <alg.h>

#define asint(v)  (*((int*)v))
int comp(const void* a,const void* 
{
if(asint(a) > asint()
	return 1;
else if(asint(a) < asint()
	return -1;
return 0;

}

extern "C" __declspec(dllexport)
void Sort(int *arr,int len)
{
qsort(arr,len,sizeof(int),comp);
}

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

confused.png Ωρες ωρες αναρωτιεμαι... "Εισαι ή δεν εισαι τρολ".

Για να είμαι απολύτως ειλικρινής, ποσώς με ενδιαφέρει σε ποιο από τα 2 θα καταλήξεις!

 

Δηλαδη κατα τη γνωμη σου, μια function qsort γραμμενει σε JavaScript δεν ειναι qsort αλλα bubble sort; Ή θελεις να μου πεις οτι τα frameworks που εχουν οι HL γλωσσες, χρησιμοποιουν εκπαιδευτικους αλγοριθμους;

Σχολίασα (αρνητικά) αυτό που προάγει ως νοοτροπία αυτό που είχα κάνει bold, ότι δηλαδή η ταχύτητα είναι αστειότητα και το ότι το μόνο που ενδιαφέρει είναι το development time (αν το ξαναδιαβάσεις λοιπόν υπό αυτό το πρίσμα, ίσως αποφασίσεις... ταχύτερα αν είμαι ή όχι troll :P).

 

BTW: Για το κωδικα που παραθατεις. Αντι να εχει μια δομη, γιατι δεν κανεις ενα απλο padding; Αν και προσωπικα δεν βλεπω το λογο να μπεις στο κοπο να φτιαξεις κατι τετοιο εφοσον στις περισσοτερες περιπτωσεις το strlen ειναι αχρηστο.

Όταν λες padding τι εννοείς; Data alignment στη μνήμη με μετατροπή των πεδίων της δομής σε bit-fields ή εννοείς απλό γέμισμα με μηδενικούς χαρακτήρες μεταξύ s->length και s->size στο πεδίο data (ή κάτι άλλο που δεν μου έρχεται τώρα στο μυαλό με τον όρο padding);

 

Αν εννοείς κάποιο από τα δυο παραπάνω, πως αντιμετωπίζει το padding το πρόβλημα του O(n) της strlen(); Τον κώδικα τον έγραψα σε συνάρτηση με τη συζήτηση που κάναμε για την προβληματική ταχύτητα εκτέλεσης της strlen() στη C, ως παράδειγμα που το αντιμετωπίζει. Μετράει το μήκος (και το μέγεθος) του κάθε string μια μόνο φορά όταν τα δημιουργεί στην str_new() κι από εκεί και πέρα κάθε αναφορά σε αυτά γίνεται σε O(1)... δηλαδή άμεσα!

 

Αυτό επισπεύδει δραματικά και την ταχύτητα εκτέλεσης κι άλλων λειτουργιών πάνω στα strings, όπως για παράδειγμα στην υλοποίηση της str_ncopy(s1, s2, n) όπου πλέον δεν χρειάζεται να μετρήσεις από την αρχή που τελειώνει το s1 ώστε να κολλήσεις εκεί το s2... το βρίσκεις σε χρόνο Ο(1) με ένα απλό: s1->len... και πάει λέγοντας για τις υλοποιήσεις κι άλλων σχετικών συναρτήσεων (π.χ. str_reverse, κλπ).

 

Η εναλλακτική που έχεις αν δεν χρησιμοποιείς κάποια δομή για τα strings είναι είτε να μετράς χειροκίνητα κάθε φορά από την αρχή τους χαρακτήρες του κάθε string όταν θες να βρεις το μήκος του είτε να χρησιμοποιήσεις την strlen, που είναι το ίδιο πράγμα (ή έστω δεν μπορώ να σκεφτώ κάτι άλλο τώρα).. προφανώς το να έχεις ξέμπαρκες μεταβλητές size & length (εννοώ εκτός δομής) για κάθε string δεν είναι καν εναλλακτική.

 

Εκτός αν με το "padding" εννοείς κάτι άλλο, που αντιμετωπίζει αλλιώς το πρόβλημα με την strlen.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

padding

>char* new_str(size_t sz)
{
char* result = new char[sz + sizeof size_t];
memcpy(result,&sz,sizeof size_t);
result += sizeof size_t;
*result = 0;
return result;
}
void free_str(char* str)
{
delete[] (str - sizeof size_t);
}


int main(int,char**)
{
char *str = new_str(100);
std::cin>>str;
std::cout<<str;
free_str(str);	

 

αλλα και παλι δεν εχει νοημα εφοσον ολα τα framework δουλευουν με cstr

πχ να κανεις κατι τετοιο scanf("%s",myStr) ή scanf("%s",myStr.data) δεν θα εχεις ηδεα για το μεγεθος του string αρα πλι πας σε strlen

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

...

Να πω την αληθια, εξεπλαγην.

csort (qsort)

>#include "stdafx.h"
#include <alg.h>

#define asint(v)  (*((int*)v))
int comp(const void* a,const void* 
{
if(asint(a) > asint()
	return 1;
else if(asint(a) < asint()
	return -1;
return 0;

}

extern "C" __declspec(dllexport)
void Sort(int *arr,int len)
{
qsort(arr,len,sizeof(int),comp);
}

Είναι γνωστό πως η έτοιμη qsort στην stdlib της C είναι αργή, διότι για ΚΑΘΕ σύγκριση στοιχείων ΚΑΛΕΙ συνάρτηση, την comp! Btw μπορείς να καλυτερέψεις ελαφρώς την ταχύτητά της, αλλάζοντας τον κώδικα της comp σε κάτι σαν το παρακάτω..

>
int comp(const void *n1, const void *n2)
{
 const int *a = (const int *) n1;
 const int *b = (const int *) n2;

 return (*a > * - (*a < *;
}

Μην περιμένεις και πολλά όμως!

 

Για να πετύχεις μέγιστες ταχύτητες εκτέλεσης της qsort στη C το καλύτερο που έχεις να κάνεις είναι να γράψεις τον κώδικα μόνος σου, και μάλιστα με optimizations που βελτιώνουν πολύ τον γενικό αλγόριθμο.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Οκ βρες μου μια qsort σε c που κανει συγκρινει integers, και οταν γυρισω απο τη δουλεια θα την βαλω στο project για να δουμε και ποσο χανουν οι hl γλωσσες (οτι χανουν, χανου.. αλλα ποσο; )

 

Πατνος 1-0 LL vs HL happy.gif αν καποιος χρησιμοποιουσε qsort απο την stdlib θα ετρωγε μεγαλο καροτο.

 

 

BTW τωρα που το σκεφτομαι, το προβλημα δεν ειναι στο καλεσμα της comp εφοσον αυτη θα εχει μπει στη L1 cache

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

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

Σύνδεση

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

Συνδεθείτε τώρα
  • Δημιουργία νέου...