google / google/jsonnet

Nontrivial string processing can get very slow

Open
#222 4 comments 1 reaction 0 assignees View on GitHub
performance
Dominant language
Jsonnet
Stars
7.6k
Forks
475
PR merge metrics
No merged PRs in 30d

Description

I think it's mostly caused the back-and-forth between lists of characters and strings.

For example, I have a function that takes a list of strings and "camelCases" the list, so that `["foo", "bar", "baz"]` turns into "fooBarBaz". Using that function on lots of strings in my larger evaluation makes the whole thing take about 40s. Replacing it with a simple `function (x) std.join("-", x)` for hyphenated names reduces total evaluation time to 10s, keeping other things equal.

The camelcase code is as follows:

```
local upper(c): local cp = std.codepoint(c); if cp >= 97 && cp < 123 then std.char(cp - 32) else c;
local capitalize(str): util.upper(str[0]) + std.substr(str, 1, std.length(str) - 1);
local zipWithIndex(f, list): std.makeArray(std.length(list), function (i) f(i, list[i]));
local camelcase(list): std.join("", util.zipWithIndex(function (i, x) if i == 0 then x else util.capitalize(x), list));
```

Not the most beautiful thing ever, but it works as intended, other than being super slow.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.