Возможно девайсы как-то разбирают (и спецы компании сертфицированы не на все). На сайте пишут, что технологию легко можно внедрить в любой процесс производства, так что, подозреваю, ограничения чисто формальные.
Ну, думается, основное ноу-хау этих ребят не заключается в том, чтобы оставить вас с незаряжающимся кирпичом, который, разумеется, никто в туалет не уронит, т. к. носить с собой не будет (только, если телефон не весит килограмм — для самообороны) :-).
Олеофобное покрытие на стекле айфона не нарушает ведь «тач», а жир «стереть» с него легко.
Правда, список поддерживаемых телефонов:
Apple iPhone 4s
Apple iPhone 4
Apple iPhone 3g/s
HTC Evo 4G
HTC Evo Shift 4G
HTC MyTouch 4G
HTC Thunderbolt
Motorola Droid X/X2
Samsung Charge
Отступ в сторону: именно поэтому лет с пять назад заставил себя читать все мануалы на английском, за пару лет подтянув уровень языка до беглого., Не хотел бы быть тем разработчиком (я не про sedot, а вообще абстрактный, без языка и руки на пульсе), который узнает все спустя год (оригинал в вордовском файле читал как раз в районе прошлой весны).
Вы сейчас о киллограмах, а мы о метрах. Речь о том, что вызов кучки асинхронных методов вместо одного не то же самое, что вызов кучки синхронных вместо одного синхронного. В последнем случае на сегодняшний день один метод или несколько друг за другом — это практически одно и то же по затратам и времени (оптимизации, инлайн, предугадывание flow и т. д.),
Ну тут уже серьезнее дела в виде перемещения со стека в кучу, аллокации на куче, напряги сборщика мусора и т. д. Отсюда и overhead по сравнению с обычными методами.
Вы не считаете async CTP упрощением? Код ведь теперь выглядит как обычный sequential. Не нужны никакие колбеки, event-based pattern (а-ля BackgroundWorker и т. д.) или begin/end. В большинстве случаев теперь не нужно думать о потоках, контекстах выполнения (а то ведь раньше не дай бог что-то ui-ное не из ui-потока обновишь), делегированию и обработке исключений и т. д.
Это не просто способ синхронизации — это координальное упрощение всей мультипоточности до той абстракции, что о потоках и их синхронизации просто теперь можешь не думать, а вызывать методы так, как будто они выполняются синхронно.
Кого «его» замедляет? По какому приложению? Мы с вами об одних вещах говорим? Видео смотрели? Task parallel library + async CTP знаете?
Я говорю о том, что вызов вот этого:
public static async Task SimpleMethod()
{
Console.WriteLine(«Hello»);
}
…в ≈13–14 раз медленнее, чем вызов вот этого:
public static void SimpleMethod()
{
Console.WriteLine(«Hello»);
}
…ибо в первом случае под катом и try/catch, и вызов методов специфических методов фреймворка, и т. д. И все становится еще сложнее, если мы возвращаем и принимаем параметры (см. видео).
Понятно, что в большинстве случаев эта разница будет незаметна, но предупрежден — значит вооружен. И к обсуждаемому типу фатального рефакторинга методов в будущем (т. е. уже сейчас) нужно подходить с осторожностью и без фанатизма.
Тогда держите набор топиков для вас на ближайшую пару неделю: Task parallel library, async ctp.
Однако вкратце отвечу на ваш вопрос. Если раньше вы бы в UI-потоке написали такую строчку:
byte[] bigData = LongDownload(string address);
…то ваше приложение бы зависло на энное количество секунд, пока качается файл.
Однако теперь одно небольшое изменение + небольшие изменения в сам метод LongDownload и вот это:
byte[] bigData = await LongDownload(string address);
…не приведет к зависанию. Как спросите вы? Метод сразу сделает return и продолжит с той же строчки уже после завершения. Под капотом за вас пишется спагетти и Task.ContinueWith + куча обработок и делегирования ошибок (то, что до async_ctp приходилось писать руками).
Парадигму маленьких методов можно и вдолбить. В школе сказали, что квадрат гипотинузы равен сумме квадратов катетов и 99,9 % просто пользуются, не доходя (в этом случае в смысле «доказать») до этого самостоятельно. Так и тут, прочитает novice урывками статью и начнет слепо и безрассудно лепить везде. А потом узнает про модификатор async (опять же, невникая в детали) и точно также просто добавит везде в существующий код (в котором, как вы можете догадаться, все донельзя раздробленно). Вот и получится то, о чем пол-лекции разглагольствует парень на channel9.
Такое сплошь и рядом. Прекарсный пример куча тормозных приложений на сервелате, где недалекие разработчики применяют шейдер к бордеру, который оборачивают вокруг всего дерева контролов (и уводя тем самым процессор под 100 % только потому, что в текстовом поле будет мигать курсор).
Осторожно замечу, что парадигма меняется.
Я про async/await с методами в C#. Если в sequential коде вызов метода практически бесплатная операция, то аналогичное с async-методом, да который еще и что-то возвращает — очень и очень даже не бесплатная (только добавив async уже в 13 раз медленнее тупо зайти в пустой метод, что эквивалентно 40 итерациям в пустом цикле синхронного метода): обработка и делегирование исключений, чтобы await-вызов метода можно было просто обернуть в обычный try-catch, а не парсить aggregate exceptions с тасками, как раньше; continuations и много чего еще типа аллокаций в кучи и т. д. — достаточно глянуть на количество генерируемого IL-кода.
Так что, ребята, без фанатизма. Иногда ничего страшного не дробить метод, а сделать внутри него пару region, которые в свернутом виде будут на глаз эквивалентны двум сигнатурам.
Поэтому каждый раз когда в асинхронном коде (а под windows 8 его будут уже писать все, если кто-то еще не пользуется async_ctp) вы создаете кучу маленьких асинзронных методов, представьте, что вы, как минимум, добавляете по 40 итераций пустого цикла в каждый из них (не говоря уже о кучи других ранее упомянутых вещей).
Понятно, что и фреймворк умный, и иногда будет выполнять асинхронный метод синхронно, если уверен в этом + есть куски, где производительность не так важна и хороший код важнее (хотя, опять же, главная цель написать хороший продукт, а уже потом — красивый код).
Может яркость слишком большую ставите? Или, наоборот, слишком маленькую яркость, являясь гиперчувствительным к мерцанию экрана при низкой подсветке (есть такие ребята) — попробуйте что-то наподобие гудридера, где можно затемнять лист без уменьшения подсветки (что-то типа оверлея полупрозрачным черным).
Я pdf+epub как пирожки горячие расхватываю, и вообще никаких проблем (правда я из той породы, что с еще ночью в школньые годы свободно читала с экрана siemens m55 :-).
iPad+Lingvo — прекрасный «тач» и хорошие словари (в последней версии уже с пару месяцев, наконец-таки, не лагает поиск даже с парой десятком установленных словарей с миллионами статей). Или нет? :-)
Думаю, многие. Далеко ходить не буду: дебетовая (поэтому понятия проценты по кредиту нет как такового) сбербанка (!) — присылают каждый месяц смс, когда списывают около 60 р. за «мобильный банк». Так же как и за годовое использование карты. Плюс, там же, если какие смешные проценты в плюс раз в год по счету приходят — тоже смс приходит.
Это как если бы ваша дочь, вытаскивала у вас втихаря из кармана вечером 60 р., а вы об этом узнавали только на следующий день, когда нет мелочи на проезд: вы, может быть, и не особо против, но ситуация — не айс.
В этом и фишка, что либо было с утра в районе 10–11, либо вечером с 21–23. А интернет-банк еще бывало и днем не давал проплатить в районе 15–16.
Репутационные риски, да. Но, опять же, можно не писать 3–4 часа. Можно просто написать: «мы молодые, но классные, бла-бла-бла, возможны небольшие проблемы у некоторых клиентов» и бог с ними со сроками (т. к. ни разу слова суппорта про три–четыре часа не подтверждались — максимум, час). И опять же сделать рассылку опциональной и по умолчанию выключенной. Но не молчать втихую. Опять же, пару раз в год — простительно (все бывает и в моем софте в т. ч.), но только если факап уже случился, я по крайней мере об этом сообщаю (а то, что это глобальный факап можно понять по 10–15-минутному ожиданию в колл-центре, при обычной минуте–двух максимум).
А карту другого банка — это, конечно, мысль разумная — на тему яиц в разных корзинах.
На тему блокировки-списания я в курсе и в целом ничего против не имею. Хотя, конечно, чисто по-человечески это проблемы платежных систем, что не могут провести операцию сразу: представьте, если бы вы купили квартиру
за 100 000 $, перечислили их владельцу, а он через неделю в момент передачи вам документов и ключей требует с вас еще 100 000 рублей только за то, что в этот день курс доллара на рубль больше, чем в тот, когда вы перечислили ему деньги. Думаю, вы знаете, куда бы отправили это продавца.
Касательно остатка, вы не учитываете другую ситуацию: допустим у меня на счете 10 317 р. Я плачу за телефон 317 рублей, потом кладу на счет кредитной карты, скажем, 50 000 и, как бы, остаюсь ничего должным банку (если считать, что у меня −60 000 кредитный лимит). На телефон я положил 317 просто потому, что в том же киви 17 рублей на счет кинуть не смогу. И, допустим, уезжаю в далекую поездку в Гималаи без карты абсолютно уверенный в том, что ничего банку не должен. А когда возвращаюсь через 4 месяца, окажется, что банк у меня втихую «досписал», грубо говоря, полтора рубля и я был в минусе все это время, хотя не знал об этом и капали проценты как и нарушения за неоплату минимального платежа.
А когда мне в суппорте говорят, что мол, если не хотите таких проблем, то перед каждой операцией проверяйте свой баланс либо через интернет-банк, либо звонком в суппорт, мне хочется послать этот суппорт в то же место, что и продавца квартиры из первого абзаца. Типа раз мы такие смс не шлем, значит это ваш геморрой. Как раз должно быть наоборот. А если не хотите слать такие смс всем, то сделайте их опциональными: захотел — включил, не захотел — не включил.
А то, что они не присылают смс, когда происходит ежемесячное списание за смс-банк + проценты (которые, в принципе, у кого-то могут быть довольно большими) так это вообще объясняют феерически: типа смски приходят только при совершении операций по кредитной карте, а оплата процентов и сумма за смс-банк — это типа со счетом. Такое мне сразу напоминает сбербанк (который, к слову, эти смски шлет, хотя я от него и убежал с удовольствием), у каждого отделения которого есть «свои» клиенты и не «свои» (типа если нужен перевыпуск карты, нужно переться именно в то отделение, где карту открывал). Как будто у моей карты один счет, а счета, к которой привязана карта — другой.
Олеофобное покрытие на стекле айфона не нарушает ведь «тач», а жир «стереть» с него легко.
Apple iPhone 4s
Apple iPhone 4
Apple iPhone 3g/s
HTC Evo 4G
HTC Evo Shift 4G
HTC MyTouch 4G
HTC Thunderbolt
Motorola Droid X/X2
Samsung Charge
А автору спасибо за перевод :-).
Это не просто способ синхронизации — это координальное упрощение всей мультипоточности до той абстракции, что о потоках и их синхронизации просто теперь можешь не думать, а вызывать методы так, как будто они выполняются синхронно.
Я говорю о том, что вызов вот этого:
public static async Task SimpleMethod()
{
Console.WriteLine(«Hello»);
}
…в ≈13–14 раз медленнее, чем вызов вот этого:
public static void SimpleMethod()
{
Console.WriteLine(«Hello»);
}
…ибо в первом случае под катом и try/catch, и вызов методов специфических методов фреймворка, и т. д. И все становится еще сложнее, если мы возвращаем и принимаем параметры (см. видео).
Понятно, что в большинстве случаев эта разница будет незаметна, но предупрежден — значит вооружен. И к обсуждаемому типу фатального рефакторинга методов в будущем (т. е. уже сейчас) нужно подходить с осторожностью и без фанатизма.
Однако вкратце отвечу на ваш вопрос. Если раньше вы бы в UI-потоке написали такую строчку:
byte[] bigData = LongDownload(string address);
…то ваше приложение бы зависло на энное количество секунд, пока качается файл.
Однако теперь одно небольшое изменение + небольшие изменения в сам метод LongDownload и вот это:
byte[] bigData = await LongDownload(string address);
…не приведет к зависанию. Как спросите вы? Метод сразу сделает return и продолжит с той же строчки уже после завершения. Под капотом за вас пишется спагетти и Task.ContinueWith + куча обработок и делегирования ошибок (то, что до async_ctp приходилось писать руками).
Такое сплошь и рядом. Прекарсный пример куча тормозных приложений на сервелате, где недалекие разработчики применяют шейдер к бордеру, который оборачивают вокруг всего дерева контролов (и уводя тем самым процессор под 100 % только потому, что в текстовом поле будет мигать курсор).
Я про async/await с методами в C#. Если в sequential коде вызов метода практически бесплатная операция, то аналогичное с async-методом, да который еще и что-то возвращает — очень и очень даже не бесплатная (только добавив async уже в 13 раз медленнее тупо зайти в пустой метод, что эквивалентно 40 итерациям в пустом цикле синхронного метода): обработка и делегирование исключений, чтобы await-вызов метода можно было просто обернуть в обычный try-catch, а не парсить aggregate exceptions с тасками, как раньше; continuations и много чего еще типа аллокаций в кучи и т. д. — достаточно глянуть на количество генерируемого IL-кода.
Так что, ребята, без фанатизма. Иногда ничего страшного не дробить метод, а сделать внутри него пару region, которые в свернутом виде будут на глаз эквивалентны двум сигнатурам.
Поэтому каждый раз когда в асинхронном коде (а под windows 8 его будут уже писать все, если кто-то еще не пользуется async_ctp) вы создаете кучу маленьких асинзронных методов, представьте, что вы, как минимум, добавляете по 40 итераций пустого цикла в каждый из них (не говоря уже о кучи других ранее упомянутых вещей).
Понятно, что и фреймворк умный, и иногда будет выполнять асинхронный метод синхронно, если уверен в этом + есть куски, где производительность не так важна и хороший код важнее (хотя, опять же, главная цель написать хороший продукт, а уже потом — красивый код).
Для тех, кто вообще не в теме, рекомендую: channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-829T
Я pdf+epub как пирожки горячие расхватываю, и вообще никаких проблем (правда я из той породы, что с еще ночью в школньые годы свободно читала с экрана siemens m55 :-).
Это как если бы ваша дочь, вытаскивала у вас втихаря из кармана вечером 60 р., а вы об этом узнавали только на следующий день, когда нет мелочи на проезд: вы, может быть, и не особо против, но ситуация — не айс.
Репутационные риски, да. Но, опять же, можно не писать 3–4 часа. Можно просто написать: «мы молодые, но классные, бла-бла-бла, возможны небольшие проблемы у некоторых клиентов» и бог с ними со сроками (т. к. ни разу слова суппорта про три–четыре часа не подтверждались — максимум, час). И опять же сделать рассылку опциональной и по умолчанию выключенной. Но не молчать втихую. Опять же, пару раз в год — простительно (все бывает и в моем софте в т. ч.), но только если факап уже случился, я по крайней мере об этом сообщаю (а то, что это глобальный факап можно понять по 10–15-минутному ожиданию в колл-центре, при обычной минуте–двух максимум).
А карту другого банка — это, конечно, мысль разумная — на тему яиц в разных корзинах.
за 100 000 $, перечислили их владельцу, а он через неделю в момент передачи вам документов и ключей требует с вас еще 100 000 рублей только за то, что в этот день курс доллара на рубль больше, чем в тот, когда вы перечислили ему деньги. Думаю, вы знаете, куда бы отправили это продавца.
Касательно остатка, вы не учитываете другую ситуацию: допустим у меня на счете 10 317 р. Я плачу за телефон 317 рублей, потом кладу на счет кредитной карты, скажем, 50 000 и, как бы, остаюсь ничего должным банку (если считать, что у меня −60 000 кредитный лимит). На телефон я положил 317 просто потому, что в том же киви 17 рублей на счет кинуть не смогу. И, допустим, уезжаю в далекую поездку в Гималаи без карты абсолютно уверенный в том, что ничего банку не должен. А когда возвращаюсь через 4 месяца, окажется, что банк у меня втихую «досписал», грубо говоря, полтора рубля и я был в минусе все это время, хотя не знал об этом и капали проценты как и нарушения за неоплату минимального платежа.
А когда мне в суппорте говорят, что мол, если не хотите таких проблем, то перед каждой операцией проверяйте свой баланс либо через интернет-банк, либо звонком в суппорт, мне хочется послать этот суппорт в то же место, что и продавца квартиры из первого абзаца. Типа раз мы такие смс не шлем, значит это ваш геморрой. Как раз должно быть наоборот. А если не хотите слать такие смс всем, то сделайте их опциональными: захотел — включил, не захотел — не включил.
А то, что они не присылают смс, когда происходит ежемесячное списание за смс-банк + проценты (которые, в принципе, у кого-то могут быть довольно большими) так это вообще объясняют феерически: типа смски приходят только при совершении операций по кредитной карте, а оплата процентов и сумма за смс-банк — это типа со счетом. Такое мне сразу напоминает сбербанк (который, к слову, эти смски шлет, хотя я от него и убежал с удовольствием), у каждого отделения которого есть «свои» клиенты и не «свои» (типа если нужен перевыпуск карты, нужно переться именно в то отделение, где карту открывал). Как будто у моей карты один счет, а счета, к которой привязана карта — другой.