Помните о подоптимизации.
Даже несмотря на то, что одна конкретная функция быстрее, чем другая, замена этого не обязательно повлияет на время выполнения вашего приложения. Вам необходимо понять, какие части вашего кода на самом деле представляют собой потенциальную проблему, и сосредоточиться на оптимизации этих частей. Помните о нотации O ваших функций и о том, как часто они вызываются. Профилировщик может помочь определить части, требующие оптимизации.
В этом вопросе есть несколько интересных моментов, почему вы не должны оптимизировать, пока в этом нет необходимости.
Вы должны посмотреть на скрытые функции C # , в этом посте рассказывается о лучших практиках разработки на C #
В основном сначала внедряйте, а затем тестируйте, где нужно оптимизировать.
Если вы используете Visual Studio Profissional, вы можете использовать Analyze -> Launch Performance Wizard для анализа производительности метода. Я не уверен, поддерживают ли другие версии эту функцию, однако, есть и некоторые коммерческие/бесплатные приложения... ищите профилировщик (см. список здесь).
Как объясняется этим вопросом SO :
yourjar.jar
yourjar.jar
Обновление от 2012 февраля:
Pacerier упоминает в комментарии о проблеме (ClassNotFound), несмотря на то, что он действительно объявил библиотеку.
У него было:
Однако решение было простым:
За 1 час тратилось впустую. Я разозлился!
Решение: убедитесь, что ваш JAR скомпилирован с 1,6, а не 1,7 .
Argh
Попробуйте использовать IGroupPolicyObject
bool SetGroupPolicy(HKEY hKey, LPCTSTR subKey, LPCTSTR valueName, DWORD dwType, const BYTE* szkeyValue, DWORD dwkeyValue)
{
CoInitialize(NULL);
HKEY ghKey, ghSubKey, hSubKey;
LPDWORD flag = NULL;
IGroupPolicyObject *pGPO = NULL;
HRESULT hr = CoCreateInstance(CLSID_GroupPolicyObject, NULL, CLSCTX_ALL, IID_IGroupPolicyObject, (LPVOID*)&pGPO);
if(!SUCCEEDED(hr))
{
MessageBox(NULL, L"Failed to initialize GPO", L"", S_OK);
}
if (RegCreateKeyEx(hKey, subKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hSubKey, flag) != ERROR_SUCCESS)
{
return false;
CoUninitialize();
}
if(dwType == REG_SZ)
{
if(RegSetValueEx(hSubKey, valueName, 0, dwType, szkeyValue, strlen((char*)szkeyValue) + 1) != ERROR_SUCCESS)
{
RegCloseKey(hSubKey);
CoUninitialize();
return false;
}
}
else if(dwType == REG_DWORD)
{
if(RegSetValueEx(hSubKey, valueName, 0, dwType, (BYTE*)&dwkeyValue, sizeof(dwkeyValue)) != ERROR_SUCCESS)
{
RegCloseKey(hSubKey);
CoUninitialize();
return false;
}
}
if(!SUCCEEDED(hr))
{
MessageBox(NULL, L"Failed to initialize GPO", L"", S_OK);
CoUninitialize();
return false;
}
if(pGPO->OpenLocalMachineGPO(GPO_OPEN_LOAD_REGISTRY) != S_OK)
{
MessageBox(NULL, L"Failed to get the GPO mapping", L"", S_OK);
CoUninitialize();
return false;
}
if(pGPO->GetRegistryKey(GPO_SECTION_USER,&ghKey) != S_OK)
{
MessageBox(NULL, L"Failed to get the root key", L"", S_OK);
CoUninitialize();
return false;
}
if(RegCreateKeyEx(ghKey, subKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &ghSubKey, flag) != ERROR_SUCCESS)
{
RegCloseKey(ghKey);
MessageBox(NULL, L"Cannot create key", L"", S_OK);
CoUninitialize();
return false;
}
if(dwType == REG_SZ)
{
if(RegSetValueEx(ghSubKey, valueName, 0, dwType, szkeyValue, strlen((char*)szkeyValue) + 1) != ERROR_SUCCESS)
{
RegCloseKey(ghKey);
RegCloseKey(ghSubKey);
MessageBox(NULL, L"Cannot create sub key", L"", S_OK);
CoUninitialize();
return false;
}
}
else if(dwType == REG_DWORD)
{
if(RegSetValueEx(ghSubKey, valueName, 0, dwType, (BYTE*)&dwkeyValue, sizeof(dwkeyValue)) != ERROR_SUCCESS)
{
RegCloseKey(ghKey);
RegCloseKey(ghSubKey);
MessageBox(NULL, L"Cannot set value", L"", S_OK);
CoUninitialize();
return false;
}
}
if(pGPO->Save(false, true, const_cast<GUID*>(&EXTENSION_GUID), const_cast<GUID*>(&CLSID_GPESnapIn)) != S_OK)
{
RegCloseKey(ghKey);
RegCloseKey(ghSubKey);
MessageBox(NULL, L"Save failed", L"", S_OK);
CoUninitialize();
return false;
}
pGPO->Release();
RegCloseKey(ghKey);
RegCloseKey(ghSubKey);
CoUninitialize();
return true;
}
Эту функцию можно вызвать следующим образом.
// Remove the Log Off in start menu
SetGroupPolicy(HKEY_CURRENT_USER,
L"Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer",
L"StartMenuLogOff", REG_DWORD, NULL, 1);
-121--4349400- Введите ДЕЙСТВИТЕЛЬНО быстро.
Вы можете получить массу советов по этому поводу. Но имейте в виду: Преждевременная оптимизация - корень всех зол.
Сначала нацельтесь на правильность , затем на ясность и только потом производительность .
Как гласит старая поговорка:
«Никого не волнует, как быстро вы можете вычислить неправильный ответ»
(на практическом уровне, однако, используйте профилировщик)
Если у вас есть профилировщик, он вам в этом поможет, а некоторые даже дадут полезные советы.
Пример: ANTS Profiler
Обычно вы обнаружите, что уменьшение количества раз, которое вы создаете строки, является основным преимуществом повышения производительности, которое вы можете получить.
Это и не возиться со сборщиком мусора вручную (если вы действительно не знаете, что делаете)
Эта ссылка на шаблоны проектирования Java слишком сложна, не слишком усложняйте там, к слову Java, вы можете использовать то, чему они учат, для разработки на любом языке.
Дело в том, что если вы хотите знать, когда что делать, какие методы использовать и т. Д., Вы говорите о шаблонах проектирования.
Я бы хотел, чтобы кто-то указал мне на это раньше в моей карьере.
В этом есть два фактора:
С одной стороны, публичная экспонента может быть выбрана в виде небольшого числа с только двумя 1-битами (обычно 3, 17 или 65537). Это означает, что операция шифрования RSA может быть выполнена с несколькими модульными квадратами и добавлением. Это не может быть обращено вспять: если вы заставляете частную экспоненту быть небольшим числом, безопасность системы, очевидно, нарушена.
С другой стороны, держатель закрытого ключа может хранить некоторые предварительно вычисленные значения, полученные из исходных простых чисел. С их помощью он может использовать алгоритм ЭЛТ , чтобы заменить одиночную экспоненцию по модулю n-разрядного числа двумя экспоненциями по модулю n/2-разрядного числа. Это примерно в четыре раза быстрее наивного пути.
Таким образом, для пар ключей RSA со случайными публичными экспонентами операции с закрытыми ключами могут быть более быстрыми. Но эффект выбора небольшой публичной экспоненты намного больше, чем эффект более быстрого алгоритма, поэтому шифрование на практике происходит быстрее.
-121--3090580-No. Это довольно хорошая практика, чтобы сузить сферу применения, где возникают какие-то исключения. Я сделал это много в своем коде.
Однако, если вы уверены, что в одном блоке try... catch определенный вид исключения будет вызван только уникальной функцией, помещая их в тот же блок try также будет ОК.
-121--3545547-Можно скомпилировать программу в основном режиме для повышения производительности среды выполнения.
No. Это довольно хорошая практика, чтобы сузить сферу применения, где возникают какие-то исключения. Я сделал это много в своем коде.
Однако, если вы уверены, что в одном блоке try... catch, определенный вид исключения будет вызван только уникальной функцией, помещая их в тот же блок try также OK.
-121--3545547-Для повышения производительности среды выполнения можно скомпилировать программу в основном режиме.
-121--3761070-Одним из способов выяснить это самостоятельно является наличие консольного приложения, где вы пытаетесь запустить отдельные фрагменты кода друг против друга и синхронизировать их. Как здесь .
In terms of general advice:
Конечно. Вот что мы делаем:
Начнем путешествие с определения того, когда оно закончится. Ставьте значимые, ориентированные на клиента, реалистичные цели. (Как для скорости, так и для потребления ресурсов.)
Часто тщательно тестируйте свой код, чтобы убедиться, что вы достигаете своих целей по производительности.
Если вы достигли поставленных целей, не беспокойтесь о производительности. Все в порядке. Беспокойство об ошибках, надежности или функциях.
Если вы не достигли своих целей по производительности, запустите профилировщик. Используйте его, чтобы определить, какой код является наиболее опасным. Имеет смысл исправить только худший код; создание чего-то уже невероятно быстрого и легкого, немного быстрее и легче, не решит вашей проблемы с производительностью.
Перепишите медленный код, чтобы он стал более производительным. (Это сложный момент.) Убедитесь, что вы проверили его, чтобы убедиться, что он действительно лучше.
Если, несмотря на все ваши усилия, вы не можете сделать его достаточно хорошим, либо переоцените свои цели, либо отмените проект и потратьте свое время на то, в чем вы можете добиться успеха.
Продолжайте повторять это, пока что-нибудь не отправите.
Если бы один метод всегда был быстрее другого, они бы не стали включать более медленный метод.
Единственный инвариант, когда речь идет о производительности - это то, что вам нужно профилировать. Все вытекает из этого.