Currently, taking the substring of a UTF-8 string always takes time proportional to the length of the string. While this is necessary in the general case, there are many common cases where it could be much faster, in particular when the substring is near the beginning of the end of the superstring. In those cases, the operation should only be proportional to the length of the substring.
Gist with reproduction and more detailed analysis forthcoming.
Currently, taking the substring of a UTF-8 string always takes time proportional to the length of the string. While this is necessary in the general case, there are many common cases where it could be much faster, in particular when the substring is near the beginning of the end of the superstring. In those cases, the operation should only be proportional to the length of the substring.