Как uninitiliazed переменная получает значение мусора?

Кэширование является просто практикой того, чтобы хранить данные в и получения данных из высокоэффективного хранилища (обычно память) или явно или неявно.

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

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

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

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

  • Выполнение запрос как отдельный процесс и помещенный результат в кэш. Все страницы просто получают доступ к кэшу. Можно обновлять кэшированную версию так часто, как является соответствующим (один раз в день, один раз в неделю, один каждые 5 секунд, независимо от того, что является соответствующим);
  • Кэш прозрачно через Вашего поставщика решения для хранения данных, ORM или что бы то ни было. Конечно, это зависит, на какой технологии Вы используете. Hibernate и Ibatis, например, поддерживают кэширование результата запроса;
  • Имеют Ваши страницы, выполняет запрос, если результат не находится в кэше (или это является "устаревшим", означая, что он вычисляется дольше назад, чем указанный "возраст"), и поместите его в кэш. Это имеет проблемы параллелизма, если два (или больше) отдельные процессы все решают, что они должны обновить результат, таким образом, Вы заканчиваете тем, что выполнили тот же (дорогой) запрос восемь раз сразу. Можно обработать эту блокировку кэша, но это создает другую проблему производительности. Можно также отступить к методам параллелизма на языке (например, API Java 5 параллелизма).

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

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

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

трудно быть более конкретным, чем это и дать Вам указания на то, что обойтись без знания очень [еще 1118] деталь о Вашей проблеме (как то, есть ли у Вас проблема).

10
задан Joseph Farah 18 April 2016 в 19:03
поделиться

4 ответа

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

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

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

27
ответ дан 3 December 2019 в 14:00
поделиться

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

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

6
ответ дан 3 December 2019 в 14:00
поделиться

Никто явно не назначает значение захвата. Если вы создаете переменную, определяется только местоположение переменной, а не ее значение. Вот почему мы его инициализируем. Значение мусора могло быть получено из некоторых предыдущих операций над той же памятью старыми процессами! Так что он может вместить что угодно. Я думаю, что это касается довольно большого количества языков. Я не уверен насчет списка! :)

2
ответ дан 3 December 2019 в 14:00
поделиться

Когда мы создаем переменную и не инициализируем ее, ничего не происходит. Когда вы читаете значение из этой переменной, вы получаете данные из памяти, где сейчас находится переменная. Это может выглядеть как мусор / случайное значение только потому, что переменные помещаются в память с некоторой степенью случайности.

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

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