Существует ли способ поддержать IsAjaxRequest () через RedirectToAction?

Повышение библиотеки C++ включает реализацию "кучи" Fibonacci в boost/pending/fibonacci_heap.hpp. Этот файл, по-видимому, был в pending/ в течение многих лет, и моими проекциями никогда не будет приниматься. Кроме того, в той реализации были ошибки, которые были исправлены моим знакомством и всесторонним спокойным парнем Aaron Windsor. К сожалению, большинство версий того файла, который я мог найти онлайн (и тот в libboost-dev пакете Ubuntu) все еще, имело ошибки; я должен был вытянуть чистая версия из репозитория Подверсии. забастовка>

Начиная с Повышения версии 1.49 библиотеки C++ добавили много новых структур "кучи" включая fibonacci "кучу".

я смог скомпилировать dijkstra_ heap_ performance.cpp против измененной версии [1 111] dijkstra_ shortest_ paths.hpp для сравнения "кучи" Fibonacci и двоичной "кучи". (В строке typedef relaxed_heap MutableQueue, изменение relaxed к fibonacci.) Я сначала забыл компилировать с оптимизацией, в этом случае Fibonacci и двоичная "куча" выполняют о том же с "кучей" Fibonacci, обычно превосходящей по характеристикам незначительной суммой. После того, как я скомпилировал с очень сильной оптимизацией, двоичная "куча" получила огромное повышение. В моих тестах "куча" Fibonacci только превзошла двоичную "кучу" по характеристикам, когда график был невероятно большим и плотным, например:

Generating graph...10000 vertices, 20000000 edges.
Running Dijkstra's with binary heap...1.46 seconds.
Running Dijkstra's with Fibonacci heap...1.31 seconds.
Speedup = 1.1145.

Насколько я понимаю, это заходит в принципиальные различия между "кучей" Fibonacci и двоичной "кучей". Единственное реальное теоретическое различие между этими двумя структурами данных - то, что "куча" Fibonacci поддерживает ключ уменьшения в (амортизируемом) постоянном времени. С другой стороны, двоичная "куча" получает большую производительность от их реализации как массив; использование явной структуры указателя означает, что "куча" Fibonacci переносит огромный хит производительности.

Поэтому для пользы из "кучи" Fibonacci на практике необходимо использовать их в приложении где decrease_ ключи являются невероятно частыми. С точки зрения Dijkstra это означает, что базовый график является плотным. Некоторые приложения могли быть внутренне decrease_ ключевой интенсивный; я хотел попробовать Nagomochi-Ибараки сокращенный из минимума алгоритм , потому что, по-видимому, он генерирует много decrease_ ключи, но это было слишком много усилия получить работу сравнения синхронизации.

Предупреждение : Я, возможно, сделал что-то не так. Можно хотеть попытаться воспроизвести эти результаты сами.

Теоретическое примечание : улучшенная производительность Fibonacci сваливает decrease_ в кучу; ключ важен для теоретических приложений, таков как время выполнения Dijkstra. Fibonacci помещает в "кучу", также превосходят двоичный файл по характеристикам, сваливает вставку в кучу и объединяющийся (оба амортизировали постоянно-разовый для "кучи" Fibonacci). Вставка чрезвычайно не важна, потому что она не влияет на время выполнения Dijkstra, и довольно легко изменить двоичную "кучу", чтобы также иметь, вставляют в амортизируемое постоянное время. Слияние в постоянное время является фантастическим, но не относится к этому приложению.

Личное сообщение : мой друг и я однажды написали работу, объяснив новую приоритетную очередь, которая попыталась копировать (теоретическое) время выполнения "кучи" Fibonacci без их сложности. Работа никогда не публиковалась, но мой соавтор действительно реализовывал двоичную "кучу", "кучу" Fibonacci и нашу собственную приоритетную очередь для сравнения структур данных. Графики результатов эксперимента указывают, что "куча" Fibonacci немного превзошла двоичную "кучу" по характеристикам с точки зрения общих сравнений, предположив, что "куча" Fibonacci будет работать лучше в ситуации, где стоимость сравнения превышает наверху. К сожалению, я не имею код в наличии, и по-видимому в Вашей ситуации сравнение является дешевым, таким образом, эти комментарии релевантны, но не непосредственно применимы.

Кстати, я настоятельно рекомендую попытку соответствовать времени выполнения "кучи" Fibonacci с Вашей собственной структурой данных. Я нашел, что просто переосмыслил "кучу" Fibonacci сам. Прежде чем я думал, что все сложности "кучи" Fibonacci были некоторыми случайными идеями, но позже я понял, что они были все естественными и довольно принудительными.

5
задан Richard Everett 11 June 2013 в 10:48
поделиться

3 ответа

По запросу @joshcomley, автоматический ответ с использованием подхода TempData:

Предполагается, что у вас есть BaseController, и ваши контроллеры наследуют его.

public class AjaxianController : /*Base?*/Controller
{
    private const string AjaxTempKey = "__isAjax";


    public bool IsAjax
    {
        get { return Request.IsAjaxRequest() || (TempData.ContainsKey(AjaxTempKey)); }
    }


    protected override RedirectResult Redirect(string url)
    {
        ensureAjaxFlag();
        return base.Redirect(url);
    }

    protected override RedirectToRouteResult RedirectToAction(string actionName, string controllerName, System.Web.Routing.RouteValueDictionary routeValues)
    {
        ensureAjaxFlag();
        return base.RedirectToAction(actionName, controllerName, routeValues);
    }

    protected override RedirectToRouteResult RedirectToRoute(string routeName, System.Web.Routing.RouteValueDictionary routeValues)
    {
        ensureAjaxFlag();
        return base.RedirectToRoute(routeName, routeValues);
    }


    private void ensureAjaxFlag()
    {
        if (IsAjax)
            TempData[AjaxTempKey] = true;

        else if (TempData.ContainsKey(AjaxTempKey))
            TempData.Remove(AjaxTempKey);
    }
}

Чтобы использовать это, сделайте make ваш контроллер наследуется от AjaxianController и использует свойство IsAjax вместо метода расширения IsAjaxRequest, тогда все перенаправления на контроллере будут автоматически поддерживать флаг ajax-or-not.

...

Не тестировал тем не менее, будьте осторожны с ошибками: -)

...

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

В частности, вам необходимо иметь возможность добавить в свой маршрут общее слово, например

{controller}/{action}/{format}.{ajax}.html

. А затем вместо проверки TempData вы должны вместо этого проверять RouteData ["ajax"].

А в точках расширения вместо настройки ключа TempData вы добавляете ajax в свои RouteData.

См. этот вопрос о маршруте с несколькими форматами для получения дополнительной информации.

5
ответ дан 13 December 2019 в 22:12
поделиться

Одним из способов передачи состояния является добавление дополнительного параметра маршрута, например

public ActionResult WouldYouLikeToResume(bool isAjax)
{
    if(isAjax || Request.IsAjaxRequest())
    {
        return PartialView("WouldYouLikeToResumeControl");
    }
    return View();
}

, а затем в методе регистрации:

return RedirectToAction("WouldYouLikeToResume", new { isAjax = Request.IsAjaxRequest() });

// Don't forget to also set the "ajax" parameter to false in your RouteTable
// So normal views is not considered Ajax

Затем в RouteTable для параметра «ajax» по умолчанию установлено значение false.

Или другой способ - переопределить точки расширения в вашем BaseController (у вас ведь есть, верно?), Чтобы всегда передавать состояние IsAjaxRequest.

..

Подходы TempData тоже допустимы, но я у меня небольшая аллергия на состояния при выполнении чего-либо, что выглядит RESTful: -)

Хотя не тестировал / не уточнял маршрут, но вы должны уловить идею.

0
ответ дан 13 December 2019 в 22:12
поделиться

Возможно, вы можете добавить ключ AjaxRedirected в свойство TempData перед выполнением перенаправления?

1
ответ дан 13 December 2019 в 22:12
поделиться
Другие вопросы по тегам:

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