Pular para o conteúdo

O custo de uma chamada

Atravessar a fronteira custa microssegundos: um milhão de chamadas pequenas perde para um laço daqui.

Chamar C não é de graça: cada chamada converte os argumentos, atravessa o ctypes e converte o retorno — alguns microssegundos. Para uma função que trabalha milissegundos (comprimir, decodificar, resolver um sistema), isso some. Para abs(x) num laço de um milhão, isso é o tempo.

dataforge
adopt Arcane.C as C

libc := C.padrao()
abs_c := libc.funcao("abs", ["i32"], "i32")

// correto, mas cada chamada atravessa a fronteira
soma := 0
cycle i in range(-500, 500):
    soma += abs_c(i)
assert soma is 250000

// o mesmo, sem atravessar nada
assert ([abs(i) cycle i in range(-500, 500)] >> distill a, v: a + v 0) is 250000
Vale atravessarNão vale
uma chamada que faz muito trabalhomuitas chamadas que fazem pouco
passar um bloco inteiro de uma vezpassar item a item
a função só existe em Ca mesma conta existe na linguagem

A regra de ouro: atravesse com lotes. Uma função C que recebe um ponteiro e um tamanho processa um milhão de itens numa chamada só — o qsort no exemplo de Callbacks é o modelo. E meça antes de concluir: `dataforge profile` mostra onde o tempo vai.