2010-12-13 45 views
1

J'ai besoin d'une fonction pour inverser efficacement une tranche dans golang. (Mon besoin concret est d'inverser le préfixe d'un [] octet).Manière efficace de faire pivoter une tranche dans golang

J'ai vérifié l'exemple de Effective Go avec objdump -Sd et une grande partie de la plaque de la chaudière est générée pour vérifier les indices de la matrice. Même le swap est trop inefficace.

+0

J'ai réussi à désactiver la vérification des limites avec -B – Alexandru

+3

@Matt Je n'ai pas vraiment rencontré de problèmes de vitesse pour d'autres choses que des exemples artificiels. – cthom06

Répondre

6

Tout d'abord, je dois le dire: le profil d'abord. Est-ce vraiment un goulot d'étranglement dans votre code? Si c'est le cas, vous avez quelques options.

1) Désactiver la vérification des limites. Je pense qu'il existe un indicateur de compilateur non documenté qui retourne la vérification des limites des tranches. Je ne peux pas le trouver pour le moment cependant. (EDIT: -B selon OP).

2) Ecrire la routine en C (ou assembleur), vous pouvez écrire C pour [586] c et un lien dans votre package go (vous aurez besoin d'inclure des en-têtes de $GOROOT/src/pkg/runtime), comme suit:

#include "runtime.h" 
mypackage·swapslice(Slice s) { 
    int i, j; 
    //Not a real swap loop 
    for (i = 0, j = s.len - 1; i < j; i++, j--) 
     //swap s.arr[i] and s.arr[j]; 
} 
+0

Je n'ai pas testé cela, mais 'i Christian

+0

@ Christian Je ne suis pas sûr que cette question/réponse est vraiment plus pertinente, mais vous avez raison. fixé. – cthom06