:TITLE: Comandos restantes - time, unset
;#
;# RCSID: $Header: /home/cvs/TclTutor3/lesson/Tcl_Portuguese/Tcl_Portuguese39.lsn,v 1.1 2008/08/02 12:37:36 clif Exp $
;# Copyright (c) 1995 Clif Flynt
;# 9300 Fleming Rd.
;# Dexter, MI  48130
;# clif@cflynt.com
;# Veja o arquivo "AVISO" com os termos da licença.
;#
;#*********************************************************
;# Portuguese translation: Lucio Agostinho Rocha
;# E-mail: outrosdiasvirao@yahoo.com.br
;# Last update: 17/01/2006
;#*********************************************************
:LESSON_TEXT_START_LEVEL 0:
O comando <B>time</B> mede a quantidade de tempo que um proc
ou comando leva para executar. Isso é útil quando você está
otimizando um script.
<P>
O comando <B>unset</B> exclui uma variável do espaço de nomes.
<DL>
<B><DT>time</B> <I>script ?contador?</I>
<DD>Retorna o número de milisegundos que se leva para executar o <I>script</I>.
Se <I>contador</I> é especificado, ele irá executar o script tantas
vezes quanto foram definidas no <I>contador</I>, e
exibir a média do resultado. O tempo é medido por tempo decorrido,
não o tempo de CPU.
<B><DT>unset</B> <I>variableName1 ?nomeVariavel2 ...?</I>
<DD>Exclui <I>nomeVariavel</I> do espaço de nomes do interpretador.
Se <I>nomeVariavel</I> for um nome de vetor, então o vetor inteiro é
excluído. Se <I>nomeVariavel</I> for um elemento em um vetor, então
apenas aquele elemento é excluído. Se qualquer uma das variáveis para
excluir não existe, então <B>unset</B> irá retornar um erro, e 
quaisquer variáveis depois da variável não existente não serão
excluídas.
</DL>
:TEXT_END:

:LESSON_TEXT_START_LEVEL 1:
O método mais simples de fazer um script executar mais rápido é
comprar um processador mais rápido. Em alguns casos, todavia,
essa nem sempre é uma opção. Você pode precisar otimizar o
seu script para executar mais rápido. Isso é difícl se você
não pode medir o tempo que ele leva para executar a porção do
script que você está tentando otimizar.
<P>
O comando <B>time</B> é a solução para esse problema. <B>Time</B>
irá medir a quantidade de tempo que leva para executar um script. Você
pode modificar o script, re-executar o comando <B>time</B> e ver
o quanto você melhorou.
<P>
Você pode também precisar otimizar a memória utilizada por um script,
ou talvez limpar variáveis depois de cada passo em um laço. O comando
<B>unset</B> irá excluir uma variável do espaço de nomes do interpretador.
<DL>
<B><DT>time</B> <I>script ?contador?</I>
<DD>Retorna o número de milisegundos que se leva para executar o <I>script</I>.
Se <I>contador</I> é especificado, ele irá executar o script tantas
vezes quanto foram definidas no <I>contador</I>, e
exibir a média do resultado. O tempo é medido por tempo decorrido,
não o tempo de CPU.
<B><DT>unset</B> <I>variableName1 ?nomeVariavel2 ...?</I>
<DD>Exclui <I>nomeVariavel</I> do espaço de nomes do interpretador.
Se <I>nomeVariavel</I> for um nome de vetor, então o vetor inteiro é
excluído. Se <I>nomeVariavel</I> for um elemento em um vetor, então
apenas aquele elemento é excluído. Se qualquer uma das variáveis para
excluir não existe, então <B>unset</B> irá retornar um erro, e 
quaisquer variáveis depois da variável não existente não serão
excluídas.
</DL>
:TEXT_END:

:LESSON_TEXT_START_LEVEL 2:
Uma das regras não escritas da programação de computadores é que
não importa o quão rápido um programa execute; ele poderia
ser melhor se executasse mais rápido.
<P>
O método mais simples de fazer um script executar mais rápido é
comprar um processador mais rápido. Em alguns casos, todavia,
essa nem sempre é uma opção. Você pode precisar otimizar o
seu script para executar mais rápido. Isso é difícl se você
não pode medir o tempo que ele leva para executar a porção do
script que você está tentando otimizar.
<P>
O comando <B>time</B> é a solução para esse problema. <B>Time</B>
irá medir a quantidade de tempo que leva para executar um script. Você
pode modificar o script, re-executar o comando <B>time</B> e ver
o quanto você melhorou.
<P>
Você pode também precisar otimizar a memória utilizada por um script,
ou talvez limpar variáveis depois de cada passo em um laço. O comando
<B>unset</B> irá excluir uma variável do espaço de nomes do interpretador.
<P>
Execute o exemplo e observe a saída. Os dois processos são idênticos,
exceto que <B>timetst2</B> busca uma referência direta ao índice do
vetor, enquanto que <B>timetst1</B> executa um comando de lista
para realizar a busca.
<P>
Os próximos exemplos mostram como uma variável pode ser desatribuída.
<DL>
<B><DT>time</B> <I>script ?contador?</I>
<DD>Retorna o número de milisegundos que se leva para executar o <I>script</I>.
Se <I>contador</I> é especificado, ele irá executar o script tantas
vezes quanto foram definidas no <I>contador</I>, e
exibir a média do resultado. O tempo é medido por tempo decorrido,
não o tempo de CPU.
<B><DT>unset</B> <I>variableName1 ?nomeVariavel2 ...?</I>
<DD>Exclui <I>nomeVariavel</I> do espaço de nomes do interpretador.
Se <I>nomeVariavel</I> for um nome de vetor, então o vetor inteiro é
excluído. Se <I>nomeVariavel</I> for um elemento em um vetor, então
apenas aquele elemento é excluído. Se qualquer uma das variáveis para
excluir não existe, então <B>unset</B> irá retornar um erro, e 
quaisquer variáveis depois da variável não existente não serão
excluídas.
</DL>
:TEXT_END:

:CODE_START:

;# Dois procs para demonstrar o uso do comando time 
;# para otimização de uma iteração

proc timetst1 {lista} {
  set x [lsearch $lista 5000]
  return $x
  }

proc timetst2 {vetor} {
  upvar $vetor a
  return $a(5000)
  }

# Cria uma longa lista e um grande vetor

for {set i 0} {$i < 5001} {incr i} {
  set vetor($i) $i
  lappend lista $i
}

;# Observe a diferença no tempo que leva 
;# para executar cada proc

puts "Tempo para pesquisar na lista: [ time {timetst1 $lista} 10]"
puts "Tempo para pesquisar o índice do vetor: [ time {timetst2 vetor} 10]"

;# Este porc testa pela existência de seu argumento, e
;# exibe uma informação se a variável existe ou não

proc existencia {variavel} {
  upvar $variavel varTeste
  if {[info exists varTeste]} {
    puts "$variavel existe"
    } else {
    puts "$variavel não existe"
    }
  }

;# Atribui muitas variáveis para teste e 
;# desatribuição mais tarde

set x 1
set y 2
for {set i 0} {$i < 5} {incr i} {
  set a($i) $i;
  }

puts "\nTestando a desatribuição de uma variável simples"
   ;# Confirma que x existe
existencia x
   ;# Desatribui x
unset x
puts "x foi desatribuído"
   ;# Confirma que x não existe
existencia x

;# Faz a mesma coisa para a(0)

puts "\nTestando a desatribuição para um membro de um vetor"
existencia a(0)
unset a(0)
puts "a(0) foi desatribuído"
existencia a(0)


puts "\nTestando desatribuir muitos membros de um vetor, com um erro"
existencia a(3)
existencia a(4)
catch {unset a(3) a(0) a(4)}
puts "\nDepois de tentar apagar a(3), a(0) e a(4)"
existencia a(3)
existencia a(4)

puts "\nTestando desatribuição em um vetor"
existencia a
unset a
puts "a foi desatribuído"
existencia a
:TEXT_END: