Qual deles trabalha mais rápido - operadores regulares (como , =) ou usando (-lt, -gt, -eq)? e porque?

1

Qual deles funciona mais rápido - operadores regulares (como <, >, =) ou usando (- lt, -gt, -eq) ? e por quê?

    
por sarfarazit08 23.05.2015 / 07:21

1 resposta

2

Simplesmente você pode comparar o desempenho desses operadores com o comando time :

time [ 1 -eq 0 ] real 0m0.000s user 0m0.000s sys 0m0.000s

time [ 1 = 0 ] real 0m0.000s user 0m0.000s sys 0m0.000s

O que é real significa Relógio de parede tempo e user significa tempo de espaço do usuário e sys significa tempo do sistema ou kernel .

Agora, se você comparar esses operadores com o comando time externo com um script que contenha as seguintes linhas, você verá uma saída semelhante:

Sepahrad@localhost 15:17:13 [~]$cat test.sh

#!/bin/bash [ 1 -eq 0 ] echo $?

Sepahrad@localhost 15:17:13 [~]$cat test1.sh

#!/bin/bash [ 1 == 0 ] echo $?

Agora, execute o comando time externo. Você verá uma saída semelhante novamente:

/usr/bin/time ./test.sh ou /usr/bin/time ./test1.sh

1 0.00user 0.00system 0:00.00elapsed 50%CPU (0avgtext+0avgdata 4752maxresident)k 0inputs+0outputs (0major+331minor)pagefaults 0swaps

Agora vamos dar uma olhada no código-fonte do comando bash : (Você pode encontrar o código fonte bash em link e dê uma olhada no arquivo test.c )

int
binary_test (op, arg1, arg2, flags)
     char *op, *arg1, *arg2;
     int flags;
{
  int patmatch;

  patmatch = (flags & TEST_PATMATCH);

  if (op[0] == '=' && (op[1] == '
case 'q': return (arithcomp (arg1, arg2, EQ, flags));   /* -eq
' || (op[1] == '=' && op[2] == '
if (op[0] == '=' && (op[1] == '
 else if ((op[0] == '>' || op[0] == '<') && op[1] == '
    case 'l': return (arithcomp (arg1, arg2, LT, flags));   /* -lt */
    case 'g': return (arithcomp (arg1, arg2, GT, flags));   /* -gt */
') { #if defined (HAVE_STRCOLL) if (shell_compatibility_level > 40 && flags & TEST_LOCALE) return ((op[0] == '>') ? (strcoll (arg1, arg2) > 0) : (strcoll (arg1, arg2) < 0)); else #endif return ((op[0] == '>') ? (strcmp (arg1, arg2) > 0) : (strcmp (arg1, arg2) < 0)); }
' || (op[1] == '=' && op[2] == '
int
binary_test (op, arg1, arg2, flags)
     char *op, *arg1, *arg2;
     int flags;
{
  int patmatch;

  patmatch = (flags & TEST_PATMATCH);

  if (op[0] == '=' && (op[1] == '
case 'q': return (arithcomp (arg1, arg2, EQ, flags));   /* -eq
' || (op[1] == '=' && op[2] == '
if (op[0] == '=' && (op[1] == '
 else if ((op[0] == '>' || op[0] == '<') && op[1] == '
    case 'l': return (arithcomp (arg1, arg2, LT, flags));   /* -lt */
    case 'g': return (arithcomp (arg1, arg2, GT, flags));   /* -gt */
') { #if defined (HAVE_STRCOLL) if (shell_compatibility_level > 40 && flags & TEST_LOCALE) return ((op[0] == '>') ? (strcoll (arg1, arg2) > 0) : (strcoll (arg1, arg2) < 0)); else #endif return ((op[0] == '>') ? (strcmp (arg1, arg2) > 0) : (strcmp (arg1, arg2) < 0)); }
' || (op[1] == '=' && op[2] == '%pre%'))) return (patmatch ? patcomp (arg1, arg2, EQ) : STREQ (arg1, arg2));
'))) return (patmatch ? patcomp (arg1, arg2, EQ) : STREQ (arg1, arg2)); else if ((op[0] == '>' || op[0] == '<') && op[1] == '%pre%') { #if defined (HAVE_STRCOLL) if (shell_compatibility_level > 40 && flags & TEST_LOCALE) return ((op[0] == '>') ? (strcoll (arg1, arg2) > 0) : (strcoll (arg1, arg2) < 0)); else #endif return ((op[0] == '>') ? (strcmp (arg1, arg2) > 0) : (strcmp (arg1, arg2) < 0)); } else if (op[0] == '!' && op[1] == '=' && op[2] == '%pre%') return (patmatch ? patcomp (arg1, arg2, NE) : (STREQ (arg1, arg2) == 0)); else if (op[2] == 't') { switch (op[1]) { case 'n': return (filecomp (arg1, arg2, NT)); /* -nt */ case 'o': return (filecomp (arg1, arg2, OT)); /* -ot */ case 'l': return (arithcomp (arg1, arg2, LT, flags)); /* -lt */ case 'g': return (arithcomp (arg1, arg2, GT, flags)); /* -gt */ } } else if (op[1] == 'e') { switch (op[2]) { case 'f': return (filecomp (arg1, arg2, EF)); /* -ef */ case 'q': return (arithcomp (arg1, arg2, EQ, flags)); /* -eq */ } } else if (op[2] == 'e') { switch (op[1]) { case 'n': return (arithcomp (arg1, arg2, NE, flags)); /* -ne */ case 'g': return (arithcomp (arg1, arg2, GE, flags)); /* -ge */ case 'l': return (arithcomp (arg1, arg2, LE, flags)); /* -le */ } } return (FALSE); /* should never get here */ }
'))) return (patmatch ? patcomp (arg1, arg2, EQ) : STREQ (arg1, arg2));
'))) return (patmatch ? patcomp (arg1, arg2, EQ) : STREQ (arg1, arg2)); else if ((op[0] == '>' || op[0] == '<') && op[1] == '%pre%') { #if defined (HAVE_STRCOLL) if (shell_compatibility_level > 40 && flags & TEST_LOCALE) return ((op[0] == '>') ? (strcoll (arg1, arg2) > 0) : (strcoll (arg1, arg2) < 0)); else #endif return ((op[0] == '>') ? (strcmp (arg1, arg2) > 0) : (strcmp (arg1, arg2) < 0)); } else if (op[0] == '!' && op[1] == '=' && op[2] == '%pre%') return (patmatch ? patcomp (arg1, arg2, NE) : (STREQ (arg1, arg2) == 0)); else if (op[2] == 't') { switch (op[1]) { case 'n': return (filecomp (arg1, arg2, NT)); /* -nt */ case 'o': return (filecomp (arg1, arg2, OT)); /* -ot */ case 'l': return (arithcomp (arg1, arg2, LT, flags)); /* -lt */ case 'g': return (arithcomp (arg1, arg2, GT, flags)); /* -gt */ } } else if (op[1] == 'e') { switch (op[2]) { case 'f': return (filecomp (arg1, arg2, EF)); /* -ef */ case 'q': return (arithcomp (arg1, arg2, EQ, flags)); /* -eq */ } } else if (op[2] == 'e') { switch (op[1]) { case 'n': return (arithcomp (arg1, arg2, NE, flags)); /* -ne */ case 'g': return (arithcomp (arg1, arg2, GE, flags)); /* -ge */ case 'l': return (arithcomp (arg1, arg2, LE, flags)); /* -le */ } } return (FALSE); /* should never get here */ }

Você verá -eq interpretado com esta linha:

%pre%

E = será interpretado com:

%pre%

Os operadores > ou < serão interpretados com:

%pre%

E -gt ou -lt serão interpretados com:

%pre%

Conclusão: Como você vê esses operadores interpretados com função diferente em bash código-fonte, mas acho que não há diferença no desempenho como você viu no comando time !

    
por 23.05.2015 / 13:12