Насколько медленный Отражение

Вот полное решение. В основном проблема заключается в том, что вы не вошли в WP в Edge, поэтому при создании сообщения с использованием wp_insert_post WordPress не имеет представления, к какому аккаунту следует прикрепить это сообщение.

    function wpshout_frontend_post() {
     wpshout_save_post_if_submitted();
    ?>
    <div>
        <div>
            RESERVATION
        </div>      
            <form id="new_post" class = 'datcho' name="new_post" method="post">
            <input type = 'text' name = 'ten' required>
            <input type = 'tel' name = 'sdt' required>
            <input type = 'number' name = 'num' min='1' max = '10' required>
            <input type = 'date' name = 'ngay' required>
            <input type = 'time' name = 'time' value = '13:00' min='9:00' max='21:00' required>
            <?php wp_nonce_field( 'wps-frontend-post' ); ?>


            <input type="submit" value="Reservation" id="submit" name="submit"/>

            </form>
    </div>
    <?php
}

function wpshout_save_post_if_submitted() {
    // Stop running function if form wasn't submitted
    if ( !isset(

Вот полное решение. В основном проблема заключается в том, что вы не вошли в WP в Edge, поэтому при создании сообщения с использованием wp_insert_post WordPress не имеет представления, к какому аккаунту следует прикрепить это сообщение. [110]POST['ten']) ) { return; } // Check that the nonce was set and valid if( !wp_verify_nonce(

Вот полное решение. В основном проблема заключается в том, что вы не вошли в WP в Edge, поэтому при создании сообщения с использованием wp_insert_post WordPress не имеет представления, к какому аккаунту следует прикрепить это сообщение. [110]POST['_wpnonce'], 'wps-frontend-post') ) { echo 'Did not save because your form seemed to be invalid. Sorry'; return; } // Do some minor form validation to make sure there is content // Add the content of the form to $post as an array $title = wp_strip_all_tags(

Вот полное решение. В основном проблема заключается в том, что вы не вошли в WP в Edge, поэтому при создании сообщения с использованием wp_insert_post WordPress не имеет представления, к какому аккаунту следует прикрепить это сообщение. [110]POST['ten']); $author_id = 1; // You can change it with your User ID $post = array( 'post_title' => $title, 'post_content' => $title, 'post_status' => 'draft', 'post_type' => 'datcho' 'post_author' => $author_id ); $eror = wp_insert_post($post,true); if($eror){ $sdt = wp_strip_all_tags(

Вот полное решение. В основном проблема заключается в том, что вы не вошли в WP в Edge, поэтому при создании сообщения с использованием wp_insert_post WordPress не имеет представления, к какому аккаунту следует прикрепить это сообщение. [110]POST['sdt']); $ngay = wp_strip_all_tags(

Вот полное решение. В основном проблема заключается в том, что вы не вошли в WP в Edge, поэтому при создании сообщения с использованием wp_insert_post WordPress не имеет представления, к какому аккаунту следует прикрепить это сообщение. [110]POST['ngay']); $time = wp_strip_all_tags(

Вот полное решение. В основном проблема заключается в том, что вы не вошли в WP в Edge, поэтому при создании сообщения с использованием wp_insert_post WordPress не имеет представления, к какому аккаунту следует прикрепить это сообщение. [110]POST['time']); $num = wp_strip_all_tags(

Вот полное решение. В основном проблема заключается в том, что вы не вошли в WP в Edge, поэтому при создании сообщения с использованием wp_insert_post WordPress не имеет представления, к какому аккаунту следует прикрепить это сообщение. [110]POST['num']); add_post_meta($eror, 'sdt', $sdt); add_post_meta($eror, 'ngay', $ngay); add_post_meta($eror, 'time', $time); add_post_meta($eror, 'num', $num); echo 'Saved your post successfully! :)'; }else { echo "something wrong"; } }

64
задан Marc Gravell 15 April 2013 в 15:00
поделиться

6 ответов

В в большинстве случаев: более чем достаточно быстро. Например, если вы используете это для создания объекта-обертки DAL, время, необходимое для создания объекта с помощью отражения, будет незначительным по сравнению со временем, которое необходимо для подключения к сети. Поэтому его оптимизация была бы пустой тратой времени.

Если вы используете отражение в узком цикле, есть хитрости для его улучшения:

  • дженерики (использование обертки где T: new () и MakeGenericType )
  • Delegate.CreateDelegate (для типизированного делегата; не работает для конструкторов)
  • Reflection.Emit - хардкорное
  • выражение ( как Delegate.CreateDelegate , но более гибкий и работает для конструкторов)

Но для ваших целей CreateInstance прекрасно подойдет. Придерживайтесь этого и сохраняйте вещи простыми.


Редактировать: пока остается вопрос об относительной эффективности, и хотя остается самая важная вещь, «измерить ее», я должен пояснить некоторые из вышеперечисленных. Иногда ... это имеет значение . Измерьте в первую очередь. Однако, если вы обнаружите, что слишком медленно , вы можете посмотреть на что-то вроде FastMember , который спокойно выполняет весь код Reflection.Emit в фоновом режиме. , чтобы дать вам хороший простой API; например:

var accessor = TypeAccessor.Create(type);
List<object> results = new List<object>();
foreach(var row in rows) {
    object obj = accessor.CreateNew();
    foreach(var col in cols) {
        accessor[obj, col.Name] = col.Value;
    }
    results.Add(obj);
}

, который прост, но будет очень быстрым. В конкретном примере, который я упоминаю об оболочке DAL - если вы делаете это много, рассмотрите что-то вроде dapper , который снова выполняет весь код Reflection.Emit в фоновом режиме, чтобы предоставить вам максимально быстрый, но простой в использовании API:

int id = 12345;
var orders = connection.Query<Order>(
    "select top 10 * from Orders where CustomerId = @id order by Id desc",
    new { id }).ToList();
75
ответ дан 24 November 2019 в 15:53
поделиться

Кроме того, что вы переходите по ссылкам, приведенным в других ответах, и убедитесь, что вы не пишете «патологически неверный» код, тогда для меня лучший ответ на это - проверить его самостоятельно.

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

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

Функции веб-тестирования и тестирования производительности VS.NET должны значительно упростить измерение производительности этого кода.

Если вы не используете отражение, как будет выглядеть ваш код? Какие у него будут ограничения? Может случиться так, что вы не сможете жить с теми ограничениями, с которыми столкнетесь, если удалите код отражения. Возможно, стоит попытаться разработать этот код без размышлений, чтобы увидеть, возможно ли это или альтернатива желательна.

3
ответ дан 24 November 2019 в 15:53
поделиться

Он медленнее по сравнению с неотражающим кодом. Важно не то, насколько он медленный, а его медленный , где он имеет значение . Например, если вы создаете экземпляры объектов, используя отражение в веб-среде, где ожидаемая конкуренция может возрасти до 10 КБ, это будет медленно. 1239 Во всяком случае, хорошо не беспокоиться о производительности заранее. Если что-то идет медленно, вы всегда можете ускорить их, если вы правильно спроектировали вещи, чтобы те части, которые вы ожидали, могли нуждаться в оптимизации в будущем, были локализованы.

Вы можете проверить эту знаменитую статью, если вам нужно ускорить :

Динамический ... но быстрый: Повесть о трех обезьянах, волке и классах DynamicMethod и ILGenerator

17
ответ дан 24 November 2019 в 15:53
поделиться

Хорошо, что вы нашли свое решение. Но это интересная проблема. Вызов метода с помощью отражения примерно в 3 раза медленнее, чем обычным способом. Это не проблема, если вы делаете это один раз или в некритических ситуациях. Если вы используете его 10 000 раз в критичном по времени методе, я бы подумал об изменении реализации.

5
ответ дан 24 November 2019 в 15:53
поделиться

Я делал что-то похожее, пока не начал играть с IoC. Я бы использовал определение объекта Spring для указания поставщика данных - SQL, XML или Mocks!

0
ответ дан 24 November 2019 в 15:53
поделиться
Другие вопросы по тегам:

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