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:
E =
será interpretado com:
Os operadores >
ou <
serão interpretados com:
E -gt
ou -lt
serão interpretados com:
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
!