Прежде всего:
Пожалуйста, не используйте
mysql_*
функции в новом коде . Они больше не поддерживаются и официально устарели . См. Красную рамку ? Узнайте о подготовленных операторах и используйте PDO или MySQLi - в этой статье , которые помогут вам решить, какой из них. Если вы выберете PDO, вот хороший учебник .Это происходит, когда вы пытаетесь получить данные из результата
mysql_query
, но запросЭто предупреждение и не остановит скрипт, но сделает вашу программу неправильной.
Вам нужно проверить результат, возвращенный
mysql_query
, на$res = mysql_query($sql); if (!$res) { die(mysql_error()); } // after checking, do the fetch
Вопросы, относящиеся
- mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, логическим значением в select
- Все «mysql_fetch_array () ожидает, что параметр 1 будет ресурсом, boolean задан« Вопросы по Stackoverflow
Связанные ошибки:
Другие функции
mysql*
, которые также ожидают, что ресурс результата mysql в качестве параметра приведет к той же ошибке для такой же причина.
Самое большое улучшение произошло, когда я начал использовать AsyncCalls для преобразования однопоточных приложений, которые раньше замораживали пользовательский интерфейс, в (своего рода) многопоточные приложения.
Хотя AsyncCalls может делать намного больше, я нашел его полезным для этой очень простой цели. Допустим, у вас заблокирована подпрограмма следующим образом: кнопка отключения, работа, кнопка включения. Вы перемещаете часть «Do Work» в локальную функцию (назовите ее AsyncDoWork) и добавляете четыре строки кода:
var a: IAsyncCall;
a := LocalAsyncCall(@AsyncDoWork);
while (NOT a.Finished) do
application.ProcessMessages;
a.Sync;
Для вас это запускает AsyncDoWork в отдельном потоке, в то время как ваш основной поток остается доступным для ответа на пользовательский интерфейс (например, перетаскивание окна или нажатие кнопки «Прервать»). Когда AsyncDoWork завершается, код продолжается. Поскольку я переместил его в локальную функцию, все локальные переменные доступны, и код не нужно менять.
Это очень ограниченный тип «многопоточности». В частности, это двухпотоковая передача. Вы должны убедиться, что ваша функция Async и пользовательский интерфейс не имеют доступа к одним и тем же компонентам VCL или структурам данных. (Я отключаю все элементы управления, кроме кнопки остановки.)
Я не использую это для написания новых программ. Это действительно быстрый и простой способ сделать старые программы более отзывчивыми.
Если действительно, действительно, действительно необходимо быть легким весом тогда, можно потерять VCL. Смотрите на KOL & MCK. Предоставил, делаете ли Вы это тогда, Вы торгуете функциями уменьшенного места.
Вы могли бы рассмотреть использование пакетов во время выполнения. Это могло уменьшить Ваш след памяти, если существует более тогда одна программа, работающая, который записан с помощью тех же пакетов.
Если Вы используете потоки, устанавливаете их привязку процессора. Если Вы еще не используете потоки, рассматриваете использование их или изучаете асинхронный ввод-вывод (порты завершения), если Ваше приложение делает много ввода-вывода.
, Но печального ответа - то, что настройка и оптимизация даст Вам, возможно, 10%-е улучшение (и это опасно); модернизация может дать Вам 90%. Как только Вы действительно понимаете цель, часто можно вновь заявлять о проблеме (и поэтому решение) в намного лучших терминах.
Аплодисменты
Для старой разработки BDE, когда я сначала запустил Дельфи, я использовал много из TQuery
компоненты. Кто-то сказал мне использовать TTable
основная деталь после того, как я объяснил его, что я делал, и это сделало прогон программы намного быстрее.
Вызов DisableControls
может опустить ненужные обновления UI.
Рассмотрите аппаратные проблемы. Если Вам действительно нужна производительность, тогда рассматривают тип жесткого диска (дисков), на котором работают Ваша программа и Ваши базы данных. Существует много переменных особенно при выполнении базы данных. RAID является не всегда лучшим ответом также.
Использование полный FastMM и исследование документация и источник и видят, можно ли настроить его к спецификациям.
Используйте в своих интересах некоторые из код проекта FastCode. Части его были включены в надлежащий VCL/RTL (как FastMM, был), но существует больше там, можно использовать!
Примечание, они имеют новый сайт , они перемещаются также, но это, кажется, немного неактивно.
Выключите проверку диапазона и проверку переполнения после тестирования экстенсивно.
Рассмотрите тщательное использование потоков. Если Вы не используете потоки теперь, то рассматриваете добавляющую пару. Если Вы, удостоверьтесь, что Вы не используете слишком многих. Если Вы работаете на Двойном или Четырехъядерном компьютере (который большинство больше), тогда, надлежащая настройка потока очень важна.
Вы могли посмотреть Библиотека OmniThread Gabr, но существует много библиотек потока в разработке для Дельфи. Вы могли легко реализовать свою собственную параллель для использования анонимных типов.
Прекратите использовать TStringList для всего.
TStringList не общая цель datastructure для эффективного устройства хранения данных и обработки всего от простого до составных типов. Ищите альтернативы. Я использую Контейнер Delphi и Библиотека Алгоритма (ПЕРЕВОДНАЯ КАРТИНКА, раньше известная как SDL). Julians EZDSL должен также быть хорошей альтернативой.
Предварительное выделение списков и массивов, вместо того, чтобы вырастить их с каждым повторением.
Это, вероятно, оказало самое большое влияние для меня с точки зрения скорости.
Если необходимо использовать Application.processmesssages (или подобный) в цикле, попытайтесь назвать его только каждым Энным повторением.
Точно так же при обновлении progressbar, не обновляйте его каждое повторение. Вместо этого увеличьте его x единицами каждый x повторения или масштабируйте обновления согласно времени или как процент общей длины задачи.
Уменьшите дисковые операции. Если существует достаточно памяти, загрузите файл полностью в RAM и сделайте все операции в памяти.
Используйте много утверждений для отладки, затем выключите их в поставлющемся коде.
Используйте инструмент Delphi Profiling ([приблизительно 110] здесь или здесь ) и узнайте Ваши собственные горлышки бутылки. Оптимизация неправильных узких мест является пустой тратой времени. Другими словами, если Вы применяете все эти предложения здесь, но игнорируете факт, кто-то поместил , сон (1000) (или подобный) в некотором очень важном коде является пустой тратой Вашего времени. Фиксируют Ваши фактические узкие места сначала.
Прежде чем Вы сделаете что угодно, определите медленные части. Не касайтесь рабочего кода, который работает достаточно быстро.
Сделайте интеллектуальное использование SetLength () для строк и массивов. Оптимизируйте инициализацию с FillChar или ZeroMemory.
Локальные переменные, созданные на стеке (например, типы записи), являются быстрее, чем выделенная "куча" (объекты и Новыми ()), переменные.
объекты Повторного использования, а не Уничтожают, тогда создают. Но удостоверьтесь, что код управления для этого быстрее, чем диспетчер памяти!
Проверьте используемые в большой степени циклы на вычисления, которые могли быть (по крайней мере, частично) предварительно вычислены или обработаны с таблицей поиска. Аккуратные функции являются классиком для этого, но это относится ко многим другим.
Разделение логики программы от пользовательского интерфейса, рефакторинга, затем оптимизируя наиболее используемый, большинство ресурсоемких элементов независимо.
отладка Поворота ПРОЧЬ
оптимизация Поворота ПО телефону
Удаляет все ссылки на единицы, которые Вы на самом деле не используете
, Ищут утечки памяти
При работе с tstringlist (или подобный), набор "отсортировал: = ложь", пока не необходимый (если вообще). Походит на легкую задачу...
При идентификации записей используйте целые числа если вообще возможный для рекордного сравнения. В то время как первичный ключ "названия компании" мог бы казаться логичным, время потратило генерацию, и хранение хеша этого значительно улучшит полное время поиска.
Рассмотрите, является ли база данных DBMS действительно отличным выбором. Если Вы только считываете данные и никогда не изменяете их, то плоский фиксированный рекордный файл мог работать быстрее, особенно если путь к данным может быть легко отображен (т.е., один индекс). Тривиальный двоичный поиск на фиксированном рекордном файле все еще чрезвычайно быстр.
Изучить все петли и найти пути к короткому замыканию. Если вы ищете что-то конкретное и нашли его в цикле, то используйте команду BREAK для немедленного освобождения под залог ... бессмысленно проходить через все остальное. Если вы знаете, что у вас нет совпадения, используйте ПРОДОЛЖЕНИЕ как можно быстрее.
Если у вас есть список, используйте динамический массив чего угодно, даже следующую запись:
Для этого не нужны классы, нет освобождения и доступа к нему очень быстро. Даже если ему нужно вырасти, вы можете это сделать - см. Ниже. Используйте только TList
или TStringList
, если вам нужна большая гибкость в изменении размера.
type
TMyRec = record
SomeString : string;
SomeValue : double;
end;
var
Data : array of TMyRec;
I : integer;
..begin
SetLength( Data, 100 ); // defines the length and CLEARS ALL DATA
Data[32].SomeString := 'Hello';
ShowMessage( Data[32] );
// Grow the list by 1 item.
I := Length( Data );
SetLength( Data, I+1 );
..end;