уменьшение неудачных обращений в кэш посредством хорошего дизайна

К сожалению, нет «предыдущего» селектора, но вы можете , возможно, получить тот же эффект, используя позиционирование (например, float right). Это зависит от того, что вы пытаетесь сделать.

В моем случае я хотел получить первую 5-звездочную рейтинговую систему CSS. Мне нужно было бы покрасить (или поменять значок) предыдущих звезд. Если плавать каждый элемент вправо, я по сути получаю тот же эффект (html для звезд, таким образом, должен быть записан «назад»).

Я использую FontAwesome в этом примере и заменяю между юникодами fa -star-o и fa-star http://fortawesome.github.io/Font-Awesome/

CSS:

.fa {
    display: inline-block;
    font-family: FontAwesome;
    font-style: normal;
    font-weight: normal;
    line-height: 1;
    -webkit-font-smoothing: antialiased;
    -moz-osx-font-smoothing: grayscale;
}

/* set all stars to 'empty star' */
.stars-container {
    display: inline-block;      
}   

/* set all stars to 'empty star' */
.stars-container .star {
    float: right;
    display: inline-block;
    padding: 2px;
    color: orange;
    cursor: pointer;

}

.stars-container .star:before {
    content: "\f006"; /* fontAwesome empty star code */
}

/* set hovered star to 'filled star' */
.star:hover:before{
    content: "\f005"; /* fontAwesome filled star code */
}

/* set all stars after hovered to'filled star' 
** it will appear that it selects all after due to positioning */
.star:hover ~ .star:before {
    content: "\f005"; /* fontAwesome filled star code */
}

HTML: (40)

JSFiddle: http://jsfiddle.net/andrewleyva/88j0105g/

22
задан Josef 20 January 2009 в 10:02
поделиться

6 ответов

Вот некоторые вещи, которые я люблю, рассматривают при работе над этим видом кода.

  • Рассматривают, хотите ли Вы "структуры массивов" или "массивов структур". То, которое Вы хотите использовать, будет зависеть от каждой части данных.
  • Попытка сохранить структуры к кратным числам 32 байтов, таким образом, они упаковывают строки кэша равномерно.
  • Делят Ваши данные в горячих и холодных элементах. Если у Вас есть массив объектов класса o, и Вы используете o.x, o.y, o.z вместе часто, но только иногда должны получать доступ к o.i, o.j, o.k тогда рассматривают помещение o.x, o.y, и o.z вместе и перемещение я, j, и k части к параллельной подмышечной структуре данных.
  • , Если у Вас есть многомерные массивы данных тогда с обычными разметками порядка строк, доступ будет очень быстр при сканировании вдоль предпочтительного размера и очень медленный вдоль других. При отображении его вперед заполнение кривая вместо этого поможет сбалансировать скорости доступа при пересечении в любом размере. (Блокирующиеся методы подобны - они - просто Z-порядок с большим основанием.)
  • , Если необходимо подвергнуться неудачному обращению в кэш, затем попытайтесь сделать как можно больше с теми данными для амортизации стоимости.
  • Вы делаете что-либо многопоточное? Не упустите замедление из протоколов непротиворечивости кэша. Флаги клавиатуры и маленькие счетчики так, чтобы они были на отдельных строках кэша.
  • SSE на Intel обеспечивает некоторую упреждающую выборку intrinsics, если Вы знаете то, к чему Вы будете получать доступ достаточно далеко загодя.
33
ответ дан 29 November 2019 в 04:17
поделиться

Существует очень хорошее видео Herb Sutter, который упоминает, что эта тема здесь

Для данных связала операции

  1. , использование выстраивает & векторы по спискам, & карт; наборы

  2. процесс строками по столбцам

9
ответ дан 29 November 2019 в 04:17
поделиться

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

, Этот вид оптимизации зависит от аппаратной архитектуры, таким образом, Вы лучше используете некоторого определенного для платформы профилировщика как Intel VTune для обнаружения возможных проблем с кэшем.

2
ответ дан 29 November 2019 в 04:17
поделиться

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

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

Немного старый теперь, но Черный список Программирования "Диаграммы Mike Abrash" все еще имеет много хороших общих рекомендаций.

2
ответ дан 29 November 2019 в 04:17
поделиться

Также, если Ваше выполнение C++ и многопоточности необходимо рассмотреть ложное совместное использование, местность и жаркость данных по кэшу каждого процессора. Это может иметь большое значение. Также особенно в многопоточности вычислительные вещи способом LIFO более эффективно, чем вычисление способом FIFO, но его также допустимый в единственной архитектуре процессора.

2
ответ дан 29 November 2019 в 04:17
поделиться

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

1
ответ дан 29 November 2019 в 04:17
поделиться
Другие вопросы по тегам:

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