Переменные сеанса против переменных URL в терминах скорости [дубликат]

Я добавил реактивный объект myData, который вы должны использовать для таблицы contents, но что более важно для обновления вариантов в selectInput (проверьте observe и updateSelectInput).

library(shiny)

ui <- shinyUI(
    fluidPage(
        fileInput("file1", "Choose file to upload", accept = ".rds"),
        selectInput("myNames","Names", ""),
        tableOutput("contents")
    )
)

server <- function(input, output, session) {

    myData <- reactive({
        inFile <- input$file1
        if (is.null(inFile)) {
            d <- myDataFrame
        } else {
            d <- readRDS(inFile$datapath)
        }
        d
    })

    output$contents <- renderTable({
        myData()
    })

    observe({
         updateSelectInput(session, "myNames",
                           label = "myNames",
                           choices = myData()$names,
                           selected = myData()$names[1])
    })

}

shinyApp(ui, server)
2
задан Dan Kanze 27 January 2012 в 05:52
поделиться

3 ответа

Я не делал никаких тестов, но я сильно подозреваю, что $ _SESSION [] будет всегда быть немного медленнее, чем обычные переменные для записи, потому что он поддерживается файловой системой или базой данных. Даже если все хранилище $ _SESSION [] кэшировано, все равно будет задействовано больше активности процессора и памяти, чем при использовании переменных, которые хранятся только локально. Для чтения все еще будет небольшая разница, но она будет незначительной по сравнению с другими факторами.

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

Если вы хотите повысить производительность, подумайте о том, чтобы дублировать некоторые из ваших проверок ввода в JavaScript. (НЕ ЗАМЕНИТЕ проверку на стороне сервера, поскольку JS не является универсальной, просто рассмотрите способы, чтобы избежать необходимости, если это возможно.)

2
ответ дан Graham 28 August 2018 в 15:29
поделиться

Я собираюсь сделать второй комментарий здесь, если вы собираетесь оптимизировать, вы не получите большого улучшения, исключив повторяющиеся переменные (хотя, если у вас есть огромные переменные, вы хотите устранить дублирование для сохранения памяти - не скорость). Однако, для демонстрации, я установил этот тест для тестирования:

session_start();
$hey = "THIS IS A TEST OF ACCESS SPEEDS"; //our variable
$_SESSION['hey'] = $hey; //out session variable
$hey_array = array('a'=>'random','b'=>'random','c'=>'random'); //another random array
$hey_array['hey'] = $hey;

function access_the_variable($var){
    $waste_some_time = substr($var,0,10); //this could be anything
}

//GO!
$start = microtime(true);
for($i=0;$i<100000;$i++){
    access_the_variable($hey);
}
$end  = microtime(true);
echo "\$hey took ".($end-$start)." microseconds<br />";

$start = microtime(true);
for($i=0;$i<100000;$i++){
    access_the_variable($_SESSION['hey']);
}
$end  = microtime(true);
echo "\$_SESSION['hey'] took ".($end-$start)." microseconds<br />";

$start = microtime(true);
for($i=0;$i<100000;$i++){
    access_the_variable($hey_array['hey']);
}
$end  = microtime(true);
echo "\$hey_array['hey'] took ".($end-$start)." microseconds<br /><br />";

Результаты нескольких прогонов:

$ hey взял 0.079180002212524 микросекунды $ _SESSION [ 'hey'] взял 0.096824884414673 микросекунды $ hey_array ['hey'] взял 0.091028928756714 микросекунд

$ hey взял 0.080883026123047 микросекунды $ _SESSION ['hey'] взял 0.095050096511841 микросекунды $ hey_array ['hey'] взял 0.091977834701538 микросекунд

$ hey взял 0.081928968429565 микросекунды $ _SESSION ['hey'] взял 0.097215890884399 микросекунды $ hey_array ['hey'] взял 0.092087030410767 микросекунд

$ hey взял 0.081655979156494 микросекунды $ _SESSION ['hey'] взял 0.098057985305786 микросекунды $ hey_array ['hey'] взял 0.09247899055481 микросекунды

$ hey взял 0.081120014190674 микросекунды $ _SESSION ['hey'] взял 0.096808910369873 микросекунды $ hey_array ['hey'] взял 0.092255115509033 микросекунды

$ hey взял 0.081827878952026 микросекунды $ _SESSION ['hey'] взял 0.0961349010467 53 микросекунды $ hey_array ['hey'] взял 0.092247009277344 микросекунды

$ hey взял 0.081613063812256 микросекунды $ _SESSION ['hey'] взял 0.096814870834351 микросекунды $ hey_array ['hey'] взял 0.090691804885864 микросекунд

Итак, в 100 000 циклов мы говорим о .01 MICROSECONDS.

Однако стоит отметить, что разность скоростей почти полностью связана с необходимостью доступа к ассоциативному массиву. Тот факт, что это суперглобал, не влияет на это (длина массива, однако, и вы начнете видеть крошечные разницы в скорости, если ваш массив SESSION станет огромным (но опять же, мы говорим о hundreths в миллионных доли секунды).

4
ответ дан Ben D 28 August 2018 в 15:29
поделиться

Существует незначительная разница в производительности. Когда я говорю «маргинальный», я имею в виду действительно, очень маленький. Тот факт, что это $_SESSION массив, не имеет каких-либо характеристик подшипника. Это ассоциативный поиск массива, который занимает немного больше времени, чем доступ к переменной.

1
ответ дан dellsala 28 August 2018 в 15:29
поделиться
Другие вопросы по тегам:

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