Question

Tout traitement de petite base de données peut être facilement résolu par Python / Perl / ... scripts, qui utilise les bibliothèques et / ou les services publics même de la langue elle-même. Cependant, en ce qui concerne la performance, les gens ont tendance à atteindre C / C ++ / langages de bas niveau. La possibilité d'adapter le code aux besoins semble être ce qui rend ces langues si attrayant pour BigData - que ce soit en matière de gestion de la mémoire, le parallélisme, l'accès au disque, ou même des optimisations bas niveau (via des constructions d'assemblage au niveau de C / C).

Bien sûr tel ensemble d'avantages ne serait pas venu sans frais: l'écriture du code, et parfois même réinventer la roue , peut être très coûteux / fastidieux. Bien qu'il existe de nombreuses bibliothèques disponibles, les gens sont enclins à écrire le code par eux-mêmes quand ils ont besoin subvention performance. Qu'est-ce que désactive assertions de performance de l'utilisation de bibliothèques lors du traitement de grandes bases de données?

Par exemple, considérons une entreprise qui rampent continuellement des pages Web et analyse les données recueillies. Pour chaque fenêtre glissante, différents algorithmes d'extraction de données sont exécutées sur les données extraites. Pourquoi les développeurs utilisant des bibliothèques au large fossé / cadres disponibles (que ce soit pour l'exploration, le traitement de texte, et l'exploration de données)? L'utilisation des choses déjà mises en œuvre ne serait pas seulement alléger le fardeau de codage du processus, mais permet également d'économiser beaucoup de temps.

Dans un seul coup :

  • ce qui rend l'écriture du code par soi-même garantie de la performance?
  • pourquoi est-il risqué à compter sur un des cadres / bibliothèques lorsque vous devez assurer haute performance?
Était-ce utile?

La solution

Après avoir fait le jeu de réécriture sur et sur moi-même (et faire encore), ma réaction immédiate a été adaptabilité .

Alors que les cadres et les bibliothèques ont un énorme arsenal de (peut-être) intertwinable routines pour les tâches standards, leurs biens-cadre souvent (toujours?) Raccourcis ne permettant pas. En fait, la plupart des cadres ont une sorte d'infrastructure autour de laquelle une couche noyau de base de la fonctionnalité de base est mis en œuvre. fonctionnalité plus spécifique rend l'utilisation de la couche de base et est placé dans une seconde couche autour du noyau.

par des raccourcis Je veux dire aller directement à partir d'une deuxième routine de la couche à une seconde couche de routine sans utiliser le noyau. Exemple typique (de mon domaine) serait horodatages: Vous avez une source de données horodatées de quelque sorte. Jusqu'à présent, le travail est simplement de lire les données hors du fil et de le transmettre au noyau afin que votre autre code peut se régaler là-dessus.

Maintenant, votre industrie modifie le format d'horodatage par défaut pour une très bonne raison (dans mon cas, ils sont passés de temps en temps unix GPS). À moins que votre cadre est spécifique à l'industrie, il est très peu probable qu'ils sont prêts à changer la représentation de base de temps, si vous vous retrouvez à l'aide d'un cadre qui presque fait ce que vous voulez. Chaque fois que vous accédez à vos données, vous devez convertir à l'industrie en temps format d'abord, et chaque fois que vous voulez modifier vous devez reconvertir à ce que les Deems de base approprient. Il n'y a aucun moyen que vous pouvez remettre les données directement à partir de la source à un puits sans double conversion.

est où vos cadres fabriqués à la main brillera, il est juste un changement mineur et vous êtes de retour modélisation du monde réel alors que tous les autres cadres (non spécifiques de l'industrie) aura maintenant un désavantage de performance.

Au fil du temps, l'écart entre le monde réel et le modèle va ajouter. Avec un cadre impromptu vous seriez bientôt face à des questions comme: Comment puis-je représenter this dans that ou comment faire accepter X routine / produits Y

.

Jusqu'à présent, cela n'a pas été à propos de C / C ++. Mais si, pour une raison quelconque, vous ne pouvez pas changer le cadre, à savoir que vous ne devez mettre en place avec double conversion de données pour aller d'un bout à l'autre, alors vous généralement employer quelque chose qui minimise les frais généraux supplémentaires. Dans mon cas, un Taï> UTC ou UTC-> convertisseur TAI est préférable de laisser à C brut (ou un FPGA). Il n'y a pas d'élégance possible, aucune structure de données intelligente profonde qui rend le problème trivial. Il est juste une instruction switch ennuyeux, et pourquoi ne pas utiliser un langage dont les compilateurs sont bonnes à optimiser exactement cela?

Autres conseils

Je ne pense pas que tout le monde atteint pour C / C ++ lorsque la performance est un problème.

L'avantage de l'écriture du code de bas niveau utilise moins de cycles CPU, ou parfois, moins de mémoire. Mais je constate que les langues de niveau supérieur peuvent appeler aux langues de niveau inférieur, et à faire, pour obtenir une partie de cette valeur. langues Python et JVM peuvent le faire.

Le scientifique de données en utilisant, par exemple, scikit-learn sur son bureau appelle déjà fortement optimisé routines natives pour faire le nombre crissant. Il n'y a pas de point par écrit un nouveau code pour la vitesse.

Dans la distribution « big data » contexte, vous êtes goulot d'étranglement plus généralement sur le mouvement des données: transfert de réseau et d'E / S. Le code natif ne permet pas. Ce qui aide n'est pas en train d'écrire le même code pour courir plus vite, mais l'écriture de code plus intelligent.

langues de niveau supérieur vont vous permettre de mettre en œuvre des algorithmes distribués plus sophistiqués dans une quantité donnée de temps de développement que C / C ++. A l'échelle, l'algorithme plus intelligent avec un meilleur mouvement de données va battre le code natif muet.

Il est généralement vrai aussi que le temps des développeurs et des bugs, des charges coûtent plus cher que le nouveau matériel. Une année de temps d'un développeur senior pourrait être 200K $ entièrement chargé; au cours d'une année qui loue aussi des centaines de serveurs valeur de temps de calcul. Il peut tout simplement pas de sens dans la plupart des cas à se soucier d'optimiser sur le matériel jeter plus à elle.

Je ne comprends pas la suite de "subvention" et "désactiver" et "assert"?

Comme tout ce que nous savons, dans le monde numérique il y a plusieurs façons de faire le même travail / obtenir les résultats attendus ..

et responsabilités / risques qui vient à partir du code sont sur les épaules des développeurs ..

Il est petit, mais je suppose un exemple très utile de monde .NET ..

De nombreux développeurs .NET utilisent le BinaryReader intégré - BinaryWriter sur leur sérialisation de données pour une performance / obtenir le contrôle sur le processus ..

est le code source CSharp du FrameWork de classe construite en BinaryWriter l'une des méthodes Write surchargées:

// Writes a boolean to this stream. A single byte is written to the stream
// with the value 0 representing false or the value 1 representing true.
// 
public virtual void Write(bool value) 
{
     //_buffer is a byte array which declared in ctor / init codes of the class
    _buffer = ((byte) (value? 1:0));

    //OutStream is the stream instance which BinaryWriter Writes the value(s) into it.
    OutStream.WriteByte(_buffer[0]);
}

Comme vous le voyez, cette méthode pourrait être écrit sans l'affectation supplémentaire à _buffer variable:

public virtual void Write(bool value) 
{
    OutStream.WriteByte((byte) (value ? 1 : 0));
}

Sans affectation que nous pourrions gagner quelques milliseconds..This quelques millisecondes peuvent accepter comme « presque rien », mais s'il y a plusieurs milliers d'écriture-(à savoir dans un processus serveur)?

laisse supposer que « peu » est 2 (millisecondes) et multi-instances Des milliers ne sont 2,000 .. Ce moyen 4 secondes plus processus time..4 secondes revenir plus tard ..

Si nous continuons à sujet de .NET et si vous pouvez vérifier les codes sources de BCL - classe de base .NET Library- de MSDN vous pouvez voir beaucoup de losts de performance du développeur décide ..

Tous du point de la source BCL Il est normal que vous voyez développeur a décidé d'utiliser while () ou boucles foreach () qui pourraient mettre en œuvre une boucle plus rapide pour () dans leur code.

Ce petit gains nous donnent la performance totale ..

Et si nous revenons à la BinaryWriter.Write () Méthode ..

En fait, l'attribution supplémentaire à une implémentation _buffer est pas un fault..This de développement est de décider exactement de « rester en sécurité »!

Supposons que nous décidons de ne pas utiliser _buffer et a décidé de mettre en œuvre la deuxième method..If nous essayons d'envoyer multi-octets des milliers sur un fil (ie upload / télécharger des données BLOB ou CLOB) avec la deuxième méthode, il peut échouons souvent à cause de la connexion lost..Cause nous essayons d'envoyer toutes les données sans aucune vérification et le contrôle de connexion mechanism.When perdu, le serveur et le client ne sait jamais les données eNVOYÉ terminées ou non.

Si le développeur décide mécanisme « séjour en toute sécurité », puis normalement, cela signifie des coûts de performance dépend de mise en œuvre « séjour en toute sécurité » (s).

Mais si le développeur décide « obtenir risqué, gain de performance » ce n'est pas une faute also..Till il y a des discussions sur « à risque » de codage.

Et comme une petite note. Les développeurs de bibliothèques commerciales tentent toujours de rester en sécurité, car ils ne peuvent pas savoir où leur code utilisera

Venant d'un point de vue des programmeurs, des cadres ciblent rarement la performance comme la plus haute priorité. Si votre bibliothèque va être largement tiré parti des choses que les gens sont susceptibles de valeur la plupart sont la facilité d'utilisation, la flexibilité et la fiabilité.

La performance est généralement évaluée dans les bibliothèques concurrentielles secondaires. « Bibliothèque X est meilleur parce qu'il est plus rapide. » Même alors très souvent ces bibliothèques troquer la solution la plus optimale pour celui qui peut être largement exploité.

En utilisant un cadre que vous prenez en soi un risque qui existe une solution plus rapide. Je pourrais aller jusqu'à dire qu'une solution plus rapide existe presque toujours.

Ecrire quelque chose vous est pas une garantie de performance, mais si vous savez ce que vous faites et ont un ensemble assez limité d'exigences, il peut aider.

Un exemple pourrait être l'analyse syntaxique JSON. Il y a une centaine de bibliothèques là-bas pour une variété de langues qui feront JSON dans un objet et vice versa référençable. Je sais que d'une mise en œuvre qui fait tout dans les registres CPU. Il est plus rapide que tous les mesurablement autres parseurs, mais il est aussi très limitée et que la limitation varie en fonction de ce CPU que vous travaillez.

La tâche de construire un analyseur syntaxique une bonne idée JSON spécifique de l'environnement de haute performant? Je miserait une bibliothèque respectée 99 fois sur 100. Dans ce un cas séparé quelques cycles CPU supplémentaires multiplié par un million d'itérations rendrait la valeur de temps de développement, il.

Licencié sous: CC-BY-SA avec attribution
scroll top