Сохранить состояние объекта в .data или attr - производительность против CSS?

В ответ на мойответ вчера о вращении изображения,Jamund сказал мне, чтобы использовать.data() вместо.attr()

Сначала я подумал, что он прав,но потом я подумал о большем контексте... всегда лучше использовать.data() вместо.attr()? Я смотрел в некоторых других сообщениях, както, что-это-лучше-данных или-атр или жеJQuery-данных против-attrdata

Ответы не были удовлетворительными для меня ...

Так что я перешел иотредактировал пример подобавив CSS. Я подумал, что было бы полезно создать разные стили для каждого изображения, если оно вращается. Мой стиль был следующим:

.rp[data-rotate="0"] {
    border:10px solid #FF0000;
}
.rp[data-rotate="90"] {
    border:10px solid #00FF00;
}
.rp[data-rotate="180"] {
    border:10px solid #0000FF;
}
.rp[data-rotate="270"] {
    border:10px solid #00FF00;
}

Поскольку дизайн и кодирование часто разделяются, было бы неплохо обрабатывать это в CSS вместо добавления этой функциональности в JavaScript. Также в моем случаеdata-rotate это какособое состояние которыйизображение в настоящее время имеет, Так что, на мой взгляд, имеет смысл представлять его в DOM.

Я также подумал, что это может быть тот случай, когда гораздо лучше сэкономить с.attr() затем с.data(). Никогда не упоминал ранее в одном из постов, которые я прочитал.

Но потом я подумал о производительности. Какая функцияБыстрее? Я построил свой собственный тест следующим образом:

<!DOCTYPE HTML>
<html>
<head>
<title>test</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script type="text/javascript">
function runfirst(dobj,dname){
  console.log("runfirst "+dname);
  console.time(dname+"-attr");
  for(i=0;i<10000;i++){
    dobj.attr("data-test","a"+i);
  }
  console.timeEnd(dname+"-attr");
  console.time(dname+"-data");
  for(i=0;i<10000;i++){
    dobj.data("data-test","a"+i);
  }
  console.timeEnd(dname+"-data");
}
function runlast(dobj,dname){
  console.log("runlast "+dname);
  console.time(dname+"-data");
  for(i=0;i<10000;i++){
    dobj.data("data-test","a"+i);
  }
  console.timeEnd(dname+"-data");
  console.time(dname+"-attr");
  for(i=0;i<10000;i++){
    dobj.attr("data-test","a"+i);
  }
  console.timeEnd(dname+"-attr");  
}
$().ready(function() {
  runfirst($("#rp4"),"#rp4");
  runfirst($("#rp3"),"#rp3");
  runlast($("#rp2"),"#rp2");
  runlast($("#rp1"),"#rp1");
});
</script>
</head>
<body>
    <div id="rp1">Testdiv 1</div>
    <div id="rp2" data-test="1">Testdiv 2</div>
    <div id="rp3">Testdiv 3</div>
    <div id="rp4" data-test="1">Testdiv 4</div>
</body>
</html>

Он также должен показать, есть ли разница с предопределеннымdata-test или нет.

Одним из результатов было это:

runfirst #rp4
#rp4-attr: 515ms
#rp4-data: 268ms
runfirst #rp3
#rp3-attr: 505ms
#rp3-data: 264ms
runlast #rp2
#rp2-data: 260ms
#rp2-attr: 521ms
runlast #rp1
#rp1-data: 284ms
#rp1-attr: 525ms

Так что.attr() функция всегда требует больше времени, чем.data() функция. Это аргумент для.data() Я думал. Потому что производительность - это всегда аргумент!

Затем я хотел опубликовать свои результаты здесь с некоторыми вопросами, и в процессе написания я сравнил их с вопросами, которые показал мне Переполнение стека (похожие названия)

И правда, был одининтересный пост о производительности

Я читаю это и запускаю их пример. И теперь я в замешательстве!Этот тест показал, что.data() тогда медленнее.attr() !? !! Почему это так?

Сначала я подумал, что это из-за другой библиотеки jQuery, поэтому я отредактировал ее испас новый, Но результат не изменился ...

Итак, теперь мои вопросы к вам:

Почему в этих двух примерах есть некоторые различия в производительности?Вы бы предпочли использовать атрибуты data-HTML5 вместо данных, если они представляют состояние? Хотя это не понадобится во время кодирования? Почему, почему нет?

Теперь в зависимости от производительности:

Будет ли производительность аргументом для вас, используя.attr() вместо данных, если это показывает, что.attr() это лучше? Хотя данные предназначены для использования для.data()?

ОБНОВЛЕНИЕ 1:
Я видел это без накладных расходов.data() намного быстрее Неправильно истолковали данные :) Но меня больше интересует мой второй вопрос. :)

Вы бы предпочли использовать атрибуты data-HTML5 вместо данных, если они представляют состояние? Хотя это не понадобится во время кодирования? Почему, почему нет?

Есть ли другие причины, по которым вы можете придумать.attr() и нет.data()? например совместимость? потому что.data() такое стиль jquery и атрибуты HTML могут быть прочитаны всеми ...

ОБНОВЛЕНИЕ 2:

Как мы видим изT.J Crowder«sтест скорости вего ответ attr гораздо быстрее, чемdata! что опять меня смущает :) Но, пожалуйста! Производительность - это аргумент, но не самый высокий! Так что дайте ответы и на мои другие вопросы, пожалуйста!

ОБНОВЛЕНИЕ 3:

Мой тест кажется ложным из-запротивопожарная ошибка Я использовал во время тестирования! Тот же файл в Chrome указанattr быстрее и второй тест наJSPerf также говоритattr быстрее

Ответы на вопрос(3)

Ваш ответ на вопрос