Стрелочный переключатель со строковыми корпусами, производительность

#flutter #performance #dart #optimization

Вопрос:

Мне было интересно, как реализован переключатель, который использует строки в качестве констант в блоке case? Когда я выполняю отладку и выполняю пошаговое выполнение, я вижу, что выполнение переходит от одного случая к другому линейно. Таким образом, это похоже на синтаксический сахар, который на самом деле представляет собой цепочку if/else. Я бы предпочел ожидать здесь некоторой оптимизации компилятора. Тогда мой вопрос в том, будет ли Maplt;String, _lambdagt; это быстрее, чем переключение/регистр для строк? Я бы предпочел не проводить никаких наивных измерений времени, так как это может привести к неправильным выводам.

Комментарии:

1. Вы должны делать то, что делает ваш код наиболее читаемым, и выполнять подобную оптимизацию производительности только в том случае, если вы можете измерить проблему производительности, связанную с вашим кодом. Этот вопрос очень сильно зависит от контекста, поэтому ответить на него непросто. Например, сколько существует случаев? Сколько раз вы вызываете этот метод?… и так далее.

2. Это метод, который будет доставлен в качестве поставщика данных для процесса синтаксического анализа. Он будет активно использоваться, и количество случаев переключения трудно определить. Так как для разных парсеров это будет по-разному. Вопрос не зависит от контекста, это состояния: является ли переключатель/регистр для строковых ключей размотанным в цепочку if-else?

3. Да, операторы переключения в Dart разматываются в цепочку вызовов if-else. Но компилятор Dart может затем выполнить некоторые оптимизации, основанные на том факте, что мы используем строки, и делает много операторов if вокруг этого. Поэтому я видел, как компилятор делает умные вещи, когда оптимизирует этот код, что также затрудняет сравнение поведения при отладке с тем, как код выполняется в режиме выпуска и компилируется.

4. Хорошо, это был ответ, который я не смог найти. Поэтому я могу ожидать оптимизаций для таких случаев, и нет необходимости искать альтернативу. Потому что скорость хэш-карты и линейного поиска совершенно разные.

5. Короче говоря, вы пытаетесь перехитрить компилятор. Не пытайтесь делать это, если вы не можете измерить проблему. И если вы можете измерить проблему, в которой компилятор мог бы быть умнее, создайте проблему на трекере SDK Dart, чтобы мы могли улучшить компилятор в будущих версиях. 🙂