Другой способ перечислить функции состоит в том, чтобы использовать представления INFORMATION_SCHEMA.
SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION'
Согласно представлениям информационной схемы "Веб-сайта Microsoft обеспечивают внутреннее, независимое от системной таблицы представление метаданных SQL Server. Представления информационной схемы позволяют приложениям работать правильно, хотя существенные изменения были внесены в базовые системные таблицы". Другими словами, базовые Системные таблицы могут измениться, поскольку SQL обновлен, но представления должны все еще остаться тем же.
SpinWait полезен на процессорах с гиперпоточностью. Благодаря гиперпоточности несколько запланированных потоков ОС могут выполняться на одном физическом процессоре, разделяя ресурсы процессора. SpinWait указывает процессору, что вы не выполняете никакой полезной работы и что он должен запускать код с другого логического процессора. Как следует из названия, он обычно используется, когда вы вращаетесь.
Предположим, у вас есть такой код:
while (!foo) {} // Spin until foo is set.
Если этот поток выполняется в потоке на гиперпоточном процессоре, он потребляет ресурсы процессора, которые могут использоваться для других потоки, работающие на процессоре.
Изменяя на:
while (!foo) {Thread.SpinWait(1);}
Мы указываем процессору, чтобы он предоставил некоторые ресурсы другому потоку.
SpinWait не влияет на планирование потоков ОС.
Что касается ваших основных вопросов о «Максимальной доходности», это в значительной степени зависит от вашей ситуации - вы не сможете получить хороший ответ, не пояснив, почему вы хотите, чтобы поток уступал. С моей точки зрения, лучший способ заставить процессор переходить в состояние ожидания и просыпаться только тогда, когда есть работа. Все остальное - просто трата времени процессора.
SpinWait рассчитан на ожидание без предоставления текущего кванта времени
Он разработан для ситуаций, когда вы знаете, что хотите что-то сделать в очень короткое время, поэтому теряете квоту времени будет чрезмерным.
У меня сложилось впечатление Thread.Yield (x) для любого значения x <квант потока был эквивалентным, включая ноль, хотя у меня нет тестов на этот счет.