Компилятор C # не оптимизирует ненужные приведения

Использовать XMLHttpRequest .

Простой запрос GET

httpRequest = new XMLHttpRequest()
httpRequest.open('GET', 'http://www.example.org/some.file')
httpRequest.send()

Простой запрос POST

httpRequest = new XMLHttpRequest()
httpRequest.open('POST', 'http://www.example.org/some/endpoint')
httpRequest.send('some data')

Мы можем указать, что запрос должен быть асинхронным (true), по умолчанию или синхронным (false) с необязательным третьим аргументом.

// Make a synchronous GET request
httpRequest.open('GET', 'http://www.example.org/some.file', false)

Мы можем установить заголовки перед вызовом httpRequest.send()

httpRequest.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

Мы можем обработать ответ, установив httpRequest.onreadystatechange в функцию перед вызовом httpRequest.send()

httpRequest.onreadystatechange = function(){
  // Process the server response here.
  if (httpRequest.readyState === XMLHttpRequest.DONE) {
    if (httpRequest.status === 200) {
      alert(httpRequest.responseText);
    } else {
      alert('There was a problem with the request.');
    }
  }
}

30
задан Community 23 May 2017 в 10:30
поделиться

3 ответа

Я думаю, что вы обнаружили небольшую ошибку в оптимизаторе. Там есть всевозможный специальный код для массивов. Спасибо, что обратили на него мое внимание.

32
ответ дан 28 November 2019 в 00:14
поделиться

Это приблизительное предположение, но я думаю, что это связано с отношением массива к его универсальному IEnumerable.

В .NET Framework версии 2.0 класс Array реализует System.Collections.Generic.IList, System.Collections.Generic.ICollection, {{1 }} и общие интерфейсы System.Collections.Generic.IEnumerable . Реализации предоставляются массивам во время выполнения и поэтому не видимы для инструментов сборки документации . В результате общие интерфейсы не отображаются в синтаксисе объявления для класса Array , а также отсутствуют справочные темы для элементов интерфейса, которые доступен только путем преобразования массива в общий тип интерфейса (явные реализации интерфейса). Ключевое , о чем следует помнить при преобразовании массива в один из этих интерфейсов, - это элементы, которые добавляют, вставляют или удаляют элементы, выбрасывают { {1}} NotSupportedException.

См. Статья MSDN .

Неясно, относится ли это к .NET 2.0+, но в этом особом случае было бы совершенно понятно, почему компилятор не может оптимизировать ваше выражение, если оно становится действительным только во время выполнения.

4
ответ дан 28 November 2019 в 00:14
поделиться

Это не похоже на просто упущенную возможность компилятора подавить приведение типов. Он будет работать, если вы напишете его так:

    ICollection<object> col = array as ICollection<object>;

, что предполагает, что он становится слишком консервативным, потому что приведение типов может вызывать исключения. Однако это работает при приведении к неуниверсальной коллекции ICollection. Я пришел к выводу, что они просто не заметили этого.

Здесь работает более серьезная проблема оптимизации: JIT-компилятор не применяет оптимизацию подъема, инвариантную для цикла. Он должен был переписать код следующим образом:

object[] array = new object[1];
ICollection<object> col = (ICollection<object>)array;
for (int i = 0; i < 100000; i++)
{
    col.Contains(null);
}

Это стандартная оптимизация, например, в генераторе кода C / C ++. Тем не менее, оптимизатор JIT не может затратить много циклов на анализ, необходимый для обнаружения таких возможных оптимизаций. Радует то, что оптимизированный управляемый код все еще достаточно поддается отладке. И что у программиста на C # все еще есть роль писать высокопроизводительный код.

2
ответ дан 28 November 2019 в 00:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: