Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Так где же тут слабое звено? Их здесь целых два — прием запроса от клиента и отправка ответа.Отдаём это на откуп nginx, обрабатывающему все запросы в одном потоке (ну, можно и в нескольких, если хочется все процессы занять) и спим спокойно, продолжая использовать существующую инфраструктуру.
Что же, все это прекрасно работает, но как то наша система чрезвычайно усложнилась, не находите? Да, хоть мы и делегируем генерацию ответа другому серверу, это все равно не самый быстрый процесс, т. к. в ходе него могут происходить блокировки из-за файлового ввода/вывода и работы с базой данных, что неминуемо приводит к простою процессора.
и вообще не знаком с JS фреймворками :D
но лично я неплохо пишу на JS, и вообще не знаком с JS фреймворками
var div;
div=document.createElement("div");
div.id='spritediv'+id;
div.style.position='absolute';
div.style.overflow='hidden';
div.style.left=x-bx;
div.style.top=y-by;
div.style.width=width;
div.style.height=height;
document.body.appendChild(div);
// =>
$('<div/>', { id : 'spritediv' + id})
.css({
position : 'absolute',
overflow : 'hidden',
left : x-bx,
top : y-by,
width : width,
height : height
})
.appendTo('body');
function SAddSprite(name,width,height,bx,by,x,y,sx,sy,tx,ty,dir,states,state)
{
var len=sprites.length,id=sprcurid++;
sprites[len]=new Array();
sprites[len][0]=id;
sprites[len][1]=name;
sprites[len][2]=width;
sprites[len][3]=height;
sprites[len][4]=bx;
sprites[len][5]=by;
sprites[len][6]=x;
sprites[len][7]=y;
sprites[len][8]=sx;
sprites[len][9]=sy;
sprites[len][10]=tx;
sprites[len][11]=ty;
sprites[len][12]=dir;
sprites[len][13]=state;
sprites[len][14]=states[state][0];
sprites[len][15]=0;
sprites[len][16]=state;
sprites[len][17]=states;
SCreateImage(id,name,width,height,bx,by,x,y,dir,sprites[len][14]);
return id;
}
SRefreshSprites() напоминает perl. Думаю, значительного улучшения читабельности можно было бы достичь, если в SAddSprite указывать в качестве sprites[len] не массив, а объект с именованными параметрами.var len=sprites.length;
sprites[len]=new Array();
// Вместо
sprites.push(new Array())
SAddSprite(name,width,height,bx,by,x,y,sx,sy,tx,ty,dir,states,state) ужасает даже больше, чем drawImage в canvasApi:// Plain Javascript
ctx.drawImage(img, 30, 30, 45, 60, 15, 15, 15, 20);
// VS (LibCanvas)
ctx.drawImage({
image : img,
crop : [30, 30, 45, 60],
draw : [15, 15, 15, 20]
});
// VS (LibCanvas)
ctx.drawImage({
image : img,
crop : {
from : [30, 30],
size : [45, 60]
},
draw : {
from : [15, 15],
size : [15, 20]
}
})
document.getElementById('test') vs $('#test') JQuery проиграет. Но, допустим, как на счёт теста — кроссбраузерно выбрать все элементы с классом «testClass» внутри элементов "<ul>". $('ul .testClass')
dom.tagName('ul').className('testClass')
getElementsByClassName? Или и в ИЕ и в Хроме будете перебирать все элементы? Знаете, что во многих браузерах движок ксс-селекторов есть нативно и вполне возможно, что через селектор будет быстрее, чем через два метода? конечно, на всяких низкоуровневых атомных тестах натив будет быстрее (что не факт). 654 request per second.Без базы медленнее, выходит? ;)
Тот же синтетический тест без базы — ~3000 RPM :)
await: https://github.com/brainopia/em-easyawait :). github.com/brainopia/em-easyrequests = Array.new(10) { EM::HttpRequest.new("http://www.postrank.com").get }results = requests.map {|it| wait it } и используем их результат.wait в em-easy делает примерно тоже самое. Весь код, который идёт после него, выполнится только тогда, когда асинхронная задача (переданная методуwait) выполнится.EM::HttpRequest.new("http://www.postrank.com").get.async Task<int> h()
{
var x = f();
var y = g();
return (await x) + (await y);
}def h
x = f()
y = g()
x + y
end
result = wait h()
def h
x = EM.defer { f() }
y = EM.defer { g() }
x + y
end
result = wait h()
+ к задаче нельзя применять и в wait пока не добавили обход массива :).def h
x = f()
y = g()
[x, y]
end
result = h().map { |i| wait i }.sum
result = будет выполнен после окончания f и g (ну типа «виртуальный callback», только там на самом деле меньше магии, за счёт использования фиберов).async Task<Xml> ApplyRemoteXslt(string xmlUri, string xsltUri)
{
var xml = GetXml(xmlUri);
var xslt = GetXml(xsltUri);
return ApplyXslt(await xml, await xslt);
}Вот, например: habrahabr.ru/blogs/webdev/102167
Например, для приложений на C, использующих libevent: libmca.anight.org
А асинхронный файловый i/o в общем случае вообще не реализуем :( Посмотрите, через какие ужасные хаки оно сделано в nginx
Вы наверное шутите, мистер Дал, или почему Node.js — это венец эволюции веб-серверов