Como melhorar o meu algoritmo para encontrar o índice de uma substring em uma string?

Por curiosidade, resolvi implementar um algoritmo para encontrar o índice da primeira ocorrência de uma substring dentro de uma string.

Cheguei nisto:

function find(str, substr) {
  let currentSubstr = '';

  for (let i = 0; i < str.length; i++) {
    let char = str(i);

    if (char === substr(currentSubstr.length)) {
      currentSubstr += char;
      if (currentSubstr.length === substr.length) {
        return i - substr.length + 1;
      }
    } else {
      currentSubstr = '';
    }
  }

  return -1;
}

Ele basicamente mantém uma variável, currentSubstr, que vai se ajustando de acordo com a substr a ser buscada conforme os caracteres da str forem ocorrendo. À medida que os caracteres vão coincidindo, currentSubstr vai ficando cada vez mais parecida com substr. Quando os comprimentos são iguais, a função termina.

Provavelmente não é a pior implementação possível, mas também penso não estar entre as melhores.

Gostaria de saber algumas coisas:

  • Essa função tem tempo de processamento O(n)?
  • Como poderia ser melhorada?