|
|
|
| В моих экспериментах быстрее всех работают функция array_diff().
Можно ли еще повысить скорость работы сравнения массивов(отсортированных).
Если написать функцию сравнения массивов на СИ, при каком условии она быстрее будет работать. | |
|
|
|
|
|
|
|
для: Valleri
(23.06.2011 в 16:51)
| | А массивы какой формы, это индексные, ассоциативные массивы? Они содержат строки, числа? | |
|
|
|
|
|
|
|
для: cheops
(23.06.2011 в 18:10)
| | Все массивы в моих экспериментах ассоциативные, ключи строковые, значения строковые. | |
|
|
|
|
|
|
|
для: Valleri
(23.06.2011 в 21:13)
| | В С/С++ таких встроенных массивов нет, т.е. придется тоже организовывать искусственные структуры или пользоваться картами STL. В общем мне кажется то на то выйдет - т.е. будет создана такая же функция. | |
|
|
|
|
|
|
|
для: cheops
(23.06.2011 в 22:15)
| | Ищу способ ускорения и тупик. Не всегда можно сравнивать упорядоченные структуры данных.
Странно, неужели это предел?
Если ниже уровень взять, по примеру СУБД, где кажется используют низкоуровневые операции.
А может можно приспособить команды из ОС, у линукса вроде большой выбор?
Может есть где-нибудь не исследованная область и рискнуть? | |
|
|
|
|
|
|
|
для: Valleri
(23.06.2011 в 22:23)
| | По этой прблеме за прошедшие 50 лет прошло стадо слонов, вряд ли тут можно сказать что-то новое. Если у вас строки и в значениях и ключах, лучше ориентироваться на тип map в STL и алгоритмы сравнения, которые предоставляет эта библиотека. Быстрее вряд ли получится написать. СУБД - это не такая быстрая штука, если половина базы данных не проиндексирована и не сидит в оперативной памяти. СУБД максимально быстро ворочает данные на диске, у вас я так понимаю все происходит в оперативной памяти - т.е. у вас в любом случае получится быстрее СУБД. | |
|
|
|
|
|
|
|
для: cheops
(23.06.2011 в 23:19)
| | На счет стада не в курсе. И что все стадо 50 лет .... СРАВНИВАЛО именно с array_diff()
Наверное они алгоритмом занимались? Тогда вероятно так.
У меня не база, а анализ баз, скажем так. Много и часто надо копать...
Тогда вопрос так сконструирую:"В какой среде(ОС) можно добиться наибольшей скорости выполнения сравнения массивов?" Под виндой как кажется всегда медленней. Может у меня тут и ошибка, поэтому и спрашиваю.
Такая вот постанова. | |
|
|
|
|
|
|
|
для: Valleri
(23.06.2011 в 23:52)
| | А какая цель всего этого? Определить идентичны ли массивы или определить какие именно элементы не совпадают? И если не секрет, от чего так сильно важна скорость? | |
|
|
|
|
|
|
|
для: MHz
(24.06.2011 в 00:00)
| | Цели могут быть самые разные.
... определить какие именно элементы одного множества данных не входят в другое множество данных.
Допустим у нас два множества по 1 000 000 элементов. Надо найти разность множеств. Если поиск одного элемента в данных другого множества занимает 1 сек, то сколько времени потребуется сравнивать два множества по1 млн.
Вот и задача:"Нужен любой, но максимально быстрый способ сравнения данных"
Мною выбраны массивы и интерпретатор PHP.
Но разве интерпретатор PHP ...самый быстрый
в начале темы вопрос:
Если написать функцию сравнения массивов на СИ, при каком условии она быстрее будет работать, чем array_diff(). | |
|
|
|
|
|
|
|
для: Valleri
(24.06.2011 в 00:29)
| | Скорее всего не будет она работать быстрее. Обвязка, т.е. чтение, сохранение, манипулирование массивом, да, будет работать быстрее, а то что внутри array_diff() вряд ли можно заставить работать сильно быстрее. Проще данные проиндексировать, т.е. хранить их постоянно в отсортированном состоянии - тогде можно добиться преимущества в сравнении. Если отказаться от ассоциативных ключей и заменить их индексами - это еще больше ускорит сравнение. | |
|
|
|
|
|
|
|
для: cheops
(24.06.2011 в 09:30)
| | Как тогда объяснить, что поиск виндовый (напр. файлов в директориях) медленнее поиска MSDOS. Или то, что под денвером (Windows) те же скрипты медленнее, чем под Linux | |
|
|
|
|
|
|
|
для: Valleri
(24.06.2011 в 17:33)
| | В Windows вы не можете напрямую работать с устройствами, только через драйвера (что разумеется медленнее), именно поэтому когда был утерен прямой контроль над видео-памятью, игры долго разрабатывали под DOS. С внедрением DirectX ситуация изменилась. В общем можно создать библиотеку поиска, которая будет очень шустро работать с устройствами под Windows. Причем не обязательно через DDK, дело в том, что в Windows поиск какой-то кривой - судя по всему через одно место сделан и здорово в обход, так как даже другие программы под Windows помоему пошустрее ищут.
>Или то, что под денвером (Windows) те же скрипты медленнее, чем под Linux
Тут не очень корректно сравнивать, так как скрипты выполняются библиотекой, которая сама подключается к Apache, который для Windows и Linux реализованы по разному, вплоть до того, что в Windows работают потоки, а в Linux - процессы. В общем, тут не совсем корректно сравнивать, лучше запускать чистые консольные программы - тут более объективное сравнение может получиться. Вообще если сильно копать, то мы скатимся к Windows API и системным вызовам UNIX. Ни на том, ни на другом кросс-платформенные вещи стараются не создавать - умучаешься сопровождать разные версии, пользуются стандартными библиотеками, которые в свою очередь используют либо Windows API и системные вызовы. Однако, оптимизируя код, вы вольны не только использовать системные функции, но перерабатывать бинарные файлы. Можно так оптимизировать exe-файл при помощи ассемблера, что она съест все ресурсы машины, у вас Windows работать перестанет на время работы этой программы. Когда мы на слабых машинах считали вещи предназначенные для суперкомпьютеров, мы пользовались именно такими программами на стероидах (ассеблерных вставках) - это потрясающее зрелище - она высасывала из машины все, я больше никогда не видел, чтобы персоналка так выкладывалась. Обычные программы которые вы видите, занимают на два порядка больше места, чем могли бы занимать и выполняются на два порядка медленнее, чем могли бы. Это не из-за лени или небрежности - так дешевле и надежнее. Типичные PHP-скрипты можно ускорить и на 3 и на 4 порядка.
Кроме того, Windows графическая среда. Видели вероятно настройку - ускорить фоновые задачи или пользовательские? Что выбирали в ней? А в диспетчере задач какой приоритет у Apache и PHP-файла? Windows прикладывает огромные усилия, чтобы одна задача не забрала под себя все ресурсы - когда нужно сосредоточить все ресурсы машины на этой задаче, да, в Linux этого добиться проще. Это не значит, что этого нельзя добиться в Windows - просто телодвижений нужно делать больше и хорошо знать устройство Windows.
>Или то, что под денвером (Windows) те же скрипты медленнее, чем под Linux
Т.е. мы берем предкомпилированные программы и операционные системы в режиме i386, т.е. для процессора 25 летней давности, берем программы, перенесенные из одной операционной системы в другую и никогда под эту операционную систему не оптимизировавшиеся. Начинаем сравнивать скорости библиотек - которые тоже не опимизировались - перенести бы, чтобы сбоев не было... Тут даже не заходит речь о том, чтобы использовать режим i586 или более серьезные возможности современных процессоров. Мы не смотрим, какого мусора компилятор насовал в исполняемый файл - работает и ладно. Тут до реальных преимуществ операционной системы и процессоров очень далеко - много очень посредников. А у создателей этих посредников очень разные цели и почти ни у кого первоочередной целью не выступает скорость. | |
|
|
|
|
|
|
|
для: cheops
(24.06.2011 в 18:25)
| | Интересно.
У меня скрипт под под Linux в 10 раз быстрее, на под Windows.
Как можно поднять быстродействие в Windows. Можно сделать выше чем под Linux. | |
|
|
|
|
|
|
|
для: Valleri
(25.06.2011 в 03:02)
| | Хм... 10 раз многова-то. А что скрипт делает? И главное где расположены Windows и Linux (последний часом не на сервере?). | |
|
|
|
|
|
|
|
для: cheops
(25.06.2011 в 09:46)
| | Компьютеры одинаковые. Linux на сервере?
Но как повысить скорость.
Даже 10 кратное ощутимо(вместо 10 часов 1 час) | |
|
|
|
|
|
|
|
для: Valleri
(25.06.2011 в 12:05)
| | А что делает скрипт? Т.е. на что он тратит основное время - база данных, вычисление, обращение к диску, обращение к сети?
PS Правильно ли я понимаю, что скрипт работает на протяжении часов? | |
|
|
|
|
|
|
|
для: cheops
(25.06.2011 в 12:21)
| | array_diff().
Именно эта функция выполняется несколько часов.
Абстрактный пример:Если поиск одного элемента множества в данных другого множества занимает 1 сек, то сколько времени потребуется сравнивать два множества по1 млн. | |
|
|
|
|
|
|
|
для: Valleri
(25.06.2011 в 12:26)
| | Хм... так, а сколько у вас элементов в массиве и сколько памяти используется скриптом для этой операции?
PS Вы из под Apache запускаете PHP или речь идет о консольном запуске скрипта? И откуда извелкаются данные для этой операции (файл, база данных, сеть)?
PPS Вообще, когда речь заходит о задачах выполняющихся несколько часов, лучше действительно отказываться от PHP (собственно, вы я так понял уже сами пришли к этой мысли). | |
|
|
|
|
|
|
|
для: cheops
(25.06.2011 в 14:33)
| | >А что делает скрипт?
array_diff().
Именно эта функция выполняется несколько часов.
Абстрактный пример:Если поиск одного элемента множества в данных другого множества занимает 1 сек, то сколько времени потребуется сравнивать два множества по1 млн.
Компьютеры одинаковые. Linux на сервере?
>м... так, а сколько у вас элементов в массиве и сколько памяти используется скриптом для этой операции?
1. От 300 000
2. -1
>Вы из под Apache запускаете PHP или речь идет о консольном запуске скрипта?
Локально-Денвер или PhpEd
Удаленно- сервер, не удобно
> И откуда извелкаются данные для этой операции (файл, база данных, сеть)?
Файлы переноса данных
>Вообще, когда речь заходит о задачах выполняющихся несколько часов, лучше действительно отказываться от PHP (собственно, вы я так понял уже сами пришли к этой мысли).
Сначала отказался от VB, 1c и других интерпретаторов.
интересы направились в компиляторы, MSDOS, Linux и пр.
Хочу Оптимизировать Windows, горит. КАК ?
Хочу попробовать Си. | |
|
|
|
|
|
|
|
для: Valleri
(25.06.2011 в 16:59)
| | >Локально-Денвер или PhpEd
>Удаленно- сервер, не удобно
Вот это немного и смущает, 1 час - это показатель на сервере? Сервер это очень отличная от обычного персонального компьютера машина, там и количество шин зачастую не 1 и процессоры стоят помощнее и стоимостью с персоналку и вообще для сервера в несколько раз обставить персональный компьютер - в порядке вещей.
>Хочу Оптимизировать Windows, горит. КАК ?
В первую очередь откажитесь от Apache (Denwer) и от браузеров - запускайте скрипт отдельно от них. Хотите скорости - убирайте посредников между программой и скриптом. Кроме того, установите высокий приоритет скрипту в диспетчере задач.
Во вторую очередь информацию в файлах нужно отсортировать и хранить в отсортированном виде (особенно если будете писать свою программу на Cи - все эффективные алгоритмы основаны на предположении, что массивы отсортированы). Хорошо бы отказаться от ассоциативного массива, и оперировать обычным массивом (даже если их будет два - для ключей и значений). Хорошо бы для каждого отсортированного массива создать массив количества символов в строках и сравнивать сначала эти два массива - это будут чисто числовые массивы, сравнение которых будет гораздо быстрее, чем строковых массивов. Обязательно проконтролируйте количество памяти, которое берет скрипт, тем более это не сложно, есть специальная функция memory_get_usage(). Важно установить умещается ли ваш скрипт в памяти или нет - если он сбрасывается на жесткий диск - можно ждать еще дольше (на серверах подсистема ввода-вывода быстрее и часто обслуживается отдельной шиной).
Попробуйте вот еще какую штуку - превратите массивы (тоже отсортированные) в строки, а лучше даже файл и возьмите md5-хеш этого файла - сравнивайте хэши, а не сами массивы. md5 - это уникальный хэш, его значения совпадают только если строки сами совпадают.
В общем суть всех ускорений - в подготовке данных, я не думаю, что получится оптимизировать Windows-версию PHP (если бы это было просто - давно бы без нас с вами сделали). А C-версия будет зависеть только от потребляемой памяти и скорости загрузки данных. В любом случае, если данные чуть-чуть подготовить - можно здорово выиграть в скорости. | |
|
|
|
|
|
|
|
для: cheops
(25.06.2011 в 18:41)
| | С данными все сделано. Данные под носом и сами просятся. А вот как ОС какую ОС, как настроить ОС, что в первую очередь с ОС сделать? ЧТо еще с ОС можно сделать
Еще не терпится написать, что 1с8.0... раз в 1000 медленней, а то и больше.
Самая страшно тормозная база. Еcть ли еще такие ? Чемпион среди тормозов | |
|
|
|
|
|
|
|
для: Valleri
(23.06.2011 в 23:52)
| | >Наверное они алгоритмом занимались? Тогда вероятно так.
Да, конечно, более того наиболее быстрые и удачные алгоритмы были реализованы в библиотеке STL. Причем это не просто библиотека - это библиотека шаблонов, т.е. она может сравнивать любой набор данных, будь то число, строка, объект.
>Под виндой как кажется всегда медленней.
Смотря что. Графика зачастую быстрее - это же графическая среда. Просто перемол цифр, которые идет при сравнении массивов везде будет выполняться примерно с одинаковой скоростью (особенно, если массивы полностью помещаются в оперативной памяти). Использовать можно и C и C++ - С++ программы приводятся препроцессором к C-программам. | |
|
|
|