0 / 0 / 0
Регистрация: 29.04.2014
Сообщений: 185
|
||||||
1 | ||||||
Как сравнить 2 массива22.06.2014, 19:04. Показов 4266. Ответов 56
Метки нет (Все метки)
в общем идея.
есть строчный массив не инициализирвоанный. Массив я заполняю сам через син. Вопрос - можно ли в зависимости от того что я введу потом сравнить через свич с доступными в свиче константами? например. я массиву задаю данные kvadrat. и така я строка встречается в свиче... Так можно делать?
0
|
22.06.2014, 19:04 | |
Ответы с готовыми решениями:
56
Как сравнить два массива Как сравнить элемент массива? Как сравнить сумму элементов массива? Как сравнить элемент двумерного массива? |
Master of Orion
|
|
29.06.2014, 16:49 | 41 |
Ладно, теперь уже в самый-самый последний раз В шарпе строка имеет дополнительные поля, в которых лежат заранее посчитанное значение хэша (потому что строки неизменяемые), заранее посчитанная длина строки (по той же причине) и прочее. Поэтому длина строки не влияет от слова вообще
0
|
Комп_Оратор)
|
|
30.06.2014, 00:28 | 42 |
Ну и если совпал хэш (длина) для двух килобайтовых строк, их что не придётся по-символьно сравнивать? Можно конечно придумать хэш, который будет уникален, но объем этого хэша будет сопоставим с объёмом строки. Можно реализовать промежуточный вариант сокращающий работу, но хэш нужен для проверки на неравенство и если она не проходит... и т.д. и т.п. Строки можно изменять передавая по ссылке если я правильно помню, но не суть. Вот длина строк, - недорогой способ избавиться от проверки при заведомом неравенстве, но если получение близких по размеру строк наиболее вероятно, то работать будет слабо. А чем лучше хэш, тем больше затрат на создание строки. В пределе он может стать ключом словаря. () Потом конечно экономия при сравнении, сортировке и поиске, но это же от убеждённости в разумности бытия так делается. Я хоть и не программист в твёрдом понимании, этого слова и тем более не системный, но сдаётся мне, что затраты на создание подобных объектов это не в духе C++.
Я подумаю и покопаюсь, а пока что не убедили Вы меня.
0
|
Master of Orion
|
|||||||||||
30.06.2014, 02:29 | 43 | ||||||||||
IGPIGP, сначала сравнивается длина, потом хэш. Если и то и то совпало, тогда да, придется посимвольно проверять, что еще делать-то . Вернее, насколько я помню, там сравнение идет по-умному, сразу по 4 байта за раз.
Хэш создается не сразу, а после первого обращения к нему. То есть когда строка создается, то в качестве хэша там мусор, при первом обращении высчитывается реальный хэш, а затем уже просто возвращается его значение при необходимости. Такой вот COW в миниатюре Я никого не убеждаю, я говорю, как оно есть. Насчет плюсов я бы не стал спорить, но вот спецификацию CLR и C# я знаю назубок, чуть хуже Рихтера Добавлено через 3 минуты Если уж очень интересно, то вот кишки фреймворка, сравнение двух строк:
1
|
Комп_Оратор)
|
|
30.06.2014, 02:58 | 44 |
Всё равно создаётся же. Я не стану спорить о том как измерить statement, не понимаю я чем две ветки с большущими строковыми ключами не подарок, если switch в здоровущем цикле закрутится. Количество оборотов же в рантайме может определяться. Что же тогда определит болевой порог компилятора? Терпеть будет?
Не по теме: Спасибо за компанию Psilon, но боюсь болевой порог модераторов раздела не беспределен. В целом где-то и по теме поговорили, но думаю пора закругляться. :)
0
|
Master of Orion
|
|
30.06.2014, 06:02 | 45 |
какой болевой порог? Все просто, меньше, допустим, 10 веток - будет if else, больше - создастся словарь (причем словарь будет скорее всего создан статически на этапе компиляции), а затем будем по словарю бегать. При числе switch-ветвлений меньше тысячи коллизий не будет точно, а 1000 кейзов... Такого я еще не видал
Не по теме:
насчет модераторов, возможно, просто перенесут в тему типа "Оператор switch для строк в C++ и C# [Holywar]" и все. Тем более, что это имеет смысл. Но пока они не решили, что это нужно - можно писать здесь ятп :)
0
|
Комп_Оратор)
|
|||||||||||
01.07.2014, 01:18 | 46 | ||||||||||
Я уже спрашивал про односимвольные строки, которые сравнивать не намного труднее целых чисел... Последний вопрос я задал о том же, но иначе: представьте длинные строки в качестве ключей в двух ветках всего. А свитч в цикле работает, то есть сравнивать часто приходится. Строчки для сравнения часто приходят на 50-70% совпадающие с ключами вначале. Пусть это пути к ресурсу, например.
Тут не могу сказать уверенно, но из того что мне попадалось, следует вроде, что может и перекомпиляция происходить или это я выдумал? Код меня гипнотизирует... Не на берегах ли могучего Ганга сотворён? Вот строка:
Или читаю я его неверно...
0
|
Master of Orion
|
|
01.07.2014, 03:03 | 47 |
Нам-то понятно, что односимвольные строки можно сравнивать как числа. Но компилятору плевать, какая там длина Тем более, что шарп оперирует исключительно UTF8-строками, поэтому "один символ" - понятие растяжимое...
просто метод EqualsHelper может вызываться откуда угодно (в пределах класса). А т.к. это стандартная библиотека, то она работает в предположении полного отказа любой части, все функции максимально независимы и всегда проверяют предусловия, не перекладывая это на вызывающий код. Тем более, что сравнить 2 числа не такая уж проблема. А вот возможные баги намного печальнее. Ну и в крайнейм случае компилятор может заинлайнить метод, увидеть две одинаковых проверки и одну выкинуть за ненадобностью. Добавлено через 33 секунды Нам-то понятно, что односимвольные строки можно сравнивать как числа. Но компилятору плевать, какая там длина Тем более, что шарп оперирует исключительно UTF8-строками, поэтому "один символ" - понятие растяжимое... просто метод EqualsHelper может вызываться откуда угодно (в пределах класса). А т.к. это стандартная библиотека, то она работает в предположении полного отказа любой части, все функции максимально независимы и всегда проверяют предусловия, не перекладывая это на вызывающий код. Тем более, что сравнить 2 числа не такая уж проблема. А вот возможные баги намного печальнее. Ну и в крайнейм случае компилятор может заинлайнить метод, увидеть две одинаковых проверки и одну выкинуть за ненадобностью. одним словом:
0
|
Комп_Оратор)
|
|
01.07.2014, 14:54 | 48 |
Это вряд ли нормально. Также как и:
Сравнение строк даже не предполагая их использования ключами в switch штука актуальная для производительности и не сотворить отдельный метод просто плохо. Так можно дойти до того, чтобы создать один метод который можно вызвать куда угодно и все библиотеки в него поместить. Назвать LibHelperUniversal или вроде того. Компилятор всегда прав. Если компилятор неправ см п.1. Последние посты уже не о сравнении строк. Предлагаю остановиться, - не подтягивается никто.
0
|
Master of Orion
|
|
01.07.2014, 15:29 | 50 |
для .Net - нормально. Слоган "безопасность любой ценой" - это про него. Тем более, как я уже сказал, компилятор вполне может выпилить лишнюю проверку, если увидит еще одну, или оставить, если её не будет
0
|
IGPIGP
|
02.07.2014, 00:24
#51
|
Не по теме: Всегда готов! Подтягивание, - отличный аргумент, хоть в данный момент и лень. Посудите, - нужно выйти из медитации, ноги из лотоса развязать... Медитирую на метод сравнения. Пытаюсь понять откуда число 10 для первого шага проверки. Магическая длина. :wizard: На 10-й минуте начал проникать внутренним взором сквозь материю и сразу понял. Руки расслаблены и лежат на коленях ладонями вверх. Интересно, что пальцев ровно 10 штук выходит, - вот оно. Индия полна мудрости и простоты. :)
0
|
Master of Orion
|
|
02.07.2014, 00:33 | 52 |
IGPIGP, на самом деле константы наверняка поименованы, просто при декомпиляции они теряются, т.к. компилятор их инлайнит
Добавлено через 2 минуты Сравнивают, кстати, по 20 байт, если заметили. Ятп они эвристически определяет оптимальный шаг)
0
|
Master of Orion
|
|
02.07.2014, 00:38 | 54 |
IGPIGP, нужно посмотреть будет на сайте фреймворка. Просто я вытаскиваю код системных классов через рефлектор, так быстрее выходит просто у меня инет умер, пишу с телефона в макдаке. Завтра постараюсь заглянуть нормально
0
|
Комп_Оратор)
|
|
02.07.2014, 00:39 | 55 |
Учитывая разрядность процессора (размер машинного слова) можно бы компилировать в зависимости от аппаратуры. Сейчас вряд ли у кого найдётся система ниже 32 бит. Побайтово этоже легче написать чем выполнить.
Но 10 шагов, это 10 шагов. Наверное это совершенно правильно.
0
|
Master of Orion
|
||||||
02.07.2014, 02:28 | 56 | |||||
IGPIGP, я когда смотрел нутри фреймворка, там методы внутри кстати используют преимущества аппаратуры. Например, встречаются записи #ifdef AMD64. Так что я склоняюсь к мысли, что дураки мы. а не они
Добавлено через 3 минуты только я сказал, и вот действительно исходники фреймворка: http://referencesource.microso... /string.cs тот же код, но в исходниках (а не при декомпиляции) выглядит так:
2
|
Модератор
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
|
|
02.07.2014, 08:15 | 57 |
IGPIGP, Psilon, Перенесите обсуждение в кулуары.
Тему закрываю.
1
|
02.07.2014, 08:15 | |
02.07.2014, 08:15 | |
Помогаю со студенческими работами здесь
57
Как сравнить элементы массива string и char? Как сравнить два элемента массива типа string? Как сравнить элемент массива с другими элементами этого же по значению? Нюансы синтаксиса: как сравнить каждый элемент массива с переменной в условии оператора if ? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |