Em algumas linguagens é possível ao desenvolvedor especificar um tamanho inicial para uma string. Raku tem algo semelhante? Eu tenho uma string onde concatenarei o texto alguns milhares de vezes. O tamanho final pode ser calculado antes de criar a string. Gostaria de testar se consigo economizar alguns 100ms com isso.
Resposta curta: Não.
Resposta mais longa: quando você concatena strings no Rakudo no backend do MoarVM, na verdade você não cria uma string concatenada: internamente, você tem um objeto que consiste em pedaços separados de strings.
Há apenas um caso em que a string é realmente concatenada: é quando você a usa como palheiro em uma expressão regular. E acredito que haja um número máximo de "pedaços" de string que, quando atingidos, causarão concatenação real na memória.
Se você está procurando otimização: não concatene todas as vezes, mas envie para um
str
array nativo e, quando terminar, então.join
:Isso geralmente é mais rápido porque a. você está usando strings nativas e b. toda a lógica de concatenação (que na verdade não é tão simples quanto você pensa porque, por exemplo, um ponto de código diacrítico pode estar no início de uma parte e precisa ser unido ao último ponto de código da parte anterior) pode ser feita no VM sem precisar alternar entre operações HLL e código C da VM.
Para aumentar a excelente resposta de @ElizabethMattijsen:
Depende do que você entende por 'tamanho inicial'. Se você estiver obtendo sua string via
IO
, em vez de usar algo comolines
você pode tentar a função Rakureadchars
, que usa um$chars
delimitador padrão para65536
.https://docs.raku.org/routine/readchars
Limitar o
readchars
comprimento dos caracteres da string ($chars
) pode proporcionar a aceleração que você procura:Quando você diz 'concatenar' texto, esses segmentos contíguos são de um arquivo? Se sim, então
readchars
seu amigo é:Além disso, Perl possui um módulo bem conhecido
IO::String
que é replicado no ecossistema Raku peloIO::String
módulo Raku de nome idêntico. Esses módulos supostamente tornam o problema que você está abordando mais tratável:https://raku.land/github:hoelzro/IO::String
Infelizmente, o módulo Raku
IO::String
não é atualizado há vários anos. Mas talvez o interesse do OP estimule um maior desenvolvimento!HTH.