Queria testar até onde ia a capacidade do meu note Intel core i5 - 3210m, 2.5GHZ.
Aí bolei este código em harbour para criar 512 Threads e executá-las simultaneamente. Este processador tem 2 núcleos porém 4 Threads.
O teste trata-se de leitura e escrita frenética em uma tabela com 100.000 registros. Simula 512 usuários escrevendo simultaneamente na tabela DBF.
O uso do processador chega rapidamente a 100% mais não trava.
Também testei o mesmo código rodando em 4 abas separadas do terminal do linux (executando 2048 Threads!!!). Neste caso o processamento ficou lento porque cada núcleo do processador precisa suportar 512 processos simultâneos, além do fato dos supostos 2048 usuários estarem usando a mesma tabela ao mesmo tempo e escrevendo cada um 100.000 nesta mesma tabela.
Eis o código:
Código: Selecionar todos
#include "hbthread.ch"
DBSETDRIVER("DBFCDX")
REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_UTF8EX
HB_LANGSELECT( 'PT' )
HB_CDPSELECT( "UTF8EX" )
func main()
memvar contador, contarT, controla
private ct:=1, numeroThreads := 512, numreg:= 100000, tam:=0
contarT := 0 // gerencia o numero de threads
controla:=numeroThreads // obriga todas as threads a rodarem ao mesmo tempo
setmode(32,125)
contador := array(numeroThreads)
for ct:= 1 to len(contador)
contador[ct] := 0
next
cls
if !file("banco.dbf")
dbcriar()
endif
tam := len(contador)
cls
timeINI = time()
// disparando as Threads
for ct := 1 to len(contador)
nNovaThread := hb_ThreadStart( HB_THREAD_INHERIT_MEMVARS, @trocar() )
do while contador[ct] == 0
inkey(0.01)
enddo
linha := 0
coluna := 0
for ct2 := 1 to tam
@ linha,coluna say str(contador[ct2],6)
linha = linha + 1
if linha > 31
linha:= 0
coluna := coluna + 7
endif
next
next
do while.t.
linha := 0
coluna := 0
for ct := 1 to tam
@ linha,coluna say str(contador[ct],6)
linha = linha + 1
if linha > 31
linha:= 0
coluna := coluna + 7
endif
next
if contarT >= tam .or. verifica(contador,numreg) == numreg
exit
endif
@ linha,coluna say str(contarT,4) + " finalizadas!"
enddo
timeFIM = time()
cls
use banco shared new
go top
alert("INICIO..: "+ timeINI + chr(13) + chr(10) + " FIM..: " + timeFIM)
@ 00,01 say "TECLA ESC PARA SAIR!"
browse(01,01,24,79)
close all
return nil
// =========================================================
function dbcriar()
aDbf := {}
AADD(aDbf, { "c1", "C", 10, 0 })
AADD(aDbf, { "c2", "C", 10, 0 })
AADD(aDbf, { "c3", "C", 10, 0 })
AADD(aDbf, { "n1", "N", 10, 0 })
AADD(aDbf, { "n2", "N", 10, 0 })
AADD(aDbf, { "n3", "N", 10, 0 })
DBCREATE("banco", aDbf,, .T.)
? time()
for ct:= 1 to numreg
dbAppend()
replace c1 with "0"
replace c2 with "1"
replace c3 with "2"
replace n1 with seconds()
replace n2 with seconds()
replace n3 with seconds()
next
dbCloseArea()
? time()
return nil
// =========================================================
function trocar()
local ct := 0, tam := len(contador)
for ct := 1 to tam
if contador[ct] == 0
ponteiro := ct
exit
endif
next
controla = controla - 1
use banco shared new
if neterr()
cls
? "Erro de abertura de arquivo DBF"
quit
endif
go top
do while.not.eof()
do while rlock() == .f.
enddo
replace c1 with alltrim(str( int( (val(c1) + val(strtran(time(),":","")) * int(hb_random(1000000))) % 1000000000 )))
replace c2 with alltrim(str(int((val(c2) + val(strtran(time(),":","")) * int(hb_random(1000000))) % 1000000000 )))
replace c3 with alltrim(str(int((val(c3) + val(strtran(time(),":","")) * int(hb_random(1000000))) % 1000000000 )))
replace n1 with (n1 * seconds() + int(hb_random(1000000))) % 1000000000
replace n2 with (n2 * seconds() + int(hb_random(1000000))) % 1000000000
replace n3 with (n3 * seconds() + int(hb_random(1000000))) % 1000000000
unlock
contador[ponteiro] := contador[ponteiro] + 1
do while controla > 0
inkey(0.1)
enddo
skip
enddo
dbCloseArea()
contarT := contarT + 1
return
// --------------------------------------------------------
function verifica(vetor,total)
local ret := 0, tam:=len(vetor), ct:=0
for ct:= 1 to tam
if vetor[ct] == total
++ret
endif
next
return ret
Yugi


