Как сделать мой код быстро [закрытым]

7
задан Gaby 23 February 2010 в 08:53
поделиться

12 ответов

Помните о подоптимизации.

Даже несмотря на то, что одна конкретная функция быстрее, чем другая, замена этого не обязательно повлияет на время выполнения вашего приложения. Вам необходимо понять, какие части вашего кода на самом деле представляют собой потенциальную проблему, и сосредоточиться на оптимизации этих частей. Помните о нотации O ваших функций и о том, как часто они вызываются. Профилировщик может помочь определить части, требующие оптимизации.

В этом вопросе есть несколько интересных моментов, почему вы не должны оптимизировать, пока в этом нет необходимости.

18
ответ дан 6 December 2019 в 04:50
поделиться

Вы должны посмотреть на скрытые функции C # , в этом посте рассказывается о лучших практиках разработки на C #

3
ответ дан 6 December 2019 в 04:50
поделиться

В основном сначала внедряйте, а затем тестируйте, где нужно оптимизировать.

Если вы используете Visual Studio Profissional, вы можете использовать Analyze -> Launch Performance Wizard для анализа производительности метода. Я не уверен, поддерживают ли другие версии эту функцию, однако, есть и некоторые коммерческие/бесплатные приложения... ищите профилировщик (см. список здесь).

5
ответ дан 6 December 2019 в 04:50
поделиться

Как объясняется этим вопросом SO :

  • Ваш проект - > щелкните правой кнопкой мыши - > Импорт - > Архивный файл - > yourjar.jar
  • Ваш проект - > щелкните правой кнопкой мыши - > Свойства - > Путь построения Java - > Библиотеки - > Добавить Jar - > yourjar.jar

eclipseexternallibrary2.png


Обновление от 2012 февраля:

Pacerier упоминает в комментарии о проблеме (ClassNotFound), несмотря на то, что он действительно объявил библиотеку.
У него было:

class not found

Однако решение было простым:

За 1 час тратилось впустую. Я разозлился!
Решение: убедитесь, что ваш JAR скомпилирован с 1,6, а не 1,7 .
Argh

-121--4126551-

Попробуйте использовать 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-

Введите ДЕЙСТВИТЕЛЬНО быстро.

5
ответ дан 6 December 2019 в 04:50
поделиться

Вы можете получить массу советов по этому поводу. Но имейте в виду: Преждевременная оптимизация - корень всех зол.

3
ответ дан 6 December 2019 в 04:50
поделиться

Сначала нацельтесь на правильность , затем на ясность и только потом производительность .

Как гласит старая поговорка:

«Никого не волнует, как быстро вы можете вычислить неправильный ответ»

(на практическом уровне, однако, используйте профилировщик)

3
ответ дан 6 December 2019 в 04:50
поделиться

Если у вас есть профилировщик, он вам в этом поможет, а некоторые даже дадут полезные советы.

Пример: ANTS Profiler

Обычно вы обнаружите, что уменьшение количества раз, которое вы создаете строки, является основным преимуществом повышения производительности, которое вы можете получить.

Это и не возиться со сборщиком мусора вручную (если вы действительно не знаете, что делаете)

Эта ссылка на шаблоны проектирования Java слишком сложна, не слишком усложняйте там, к слову Java, вы можете использовать то, чему они учат, для разработки на любом языке.

Дело в том, что если вы хотите знать, когда что делать, какие методы использовать и т. Д., Вы говорите о шаблонах проектирования.

Я бы хотел, чтобы кто-то указал мне на это раньше в моей карьере.

2
ответ дан 6 December 2019 в 04:50
поделиться

В этом есть два фактора:

С одной стороны, публичная экспонента может быть выбрана в виде небольшого числа с только двумя 1-битами (обычно 3, 17 или 65537). Это означает, что операция шифрования RSA может быть выполнена с несколькими модульными квадратами и добавлением. Это не может быть обращено вспять: если вы заставляете частную экспоненту быть небольшим числом, безопасность системы, очевидно, нарушена.

С другой стороны, держатель закрытого ключа может хранить некоторые предварительно вычисленные значения, полученные из исходных простых чисел. С их помощью он может использовать алгоритм ЭЛТ , чтобы заменить одиночную экспоненцию по модулю n-разрядного числа двумя экспоненциями по модулю n/2-разрядного числа. Это примерно в четыре раза быстрее наивного пути.

Таким образом, для пар ключей RSA со случайными публичными экспонентами операции с закрытыми ключами могут быть более быстрыми. Но эффект выбора небольшой публичной экспоненты намного больше, чем эффект более быстрого алгоритма, поэтому шифрование на практике происходит быстрее.

-121--3090580-

No. Это довольно хорошая практика, чтобы сузить сферу применения, где возникают какие-то исключения. Я сделал это много в своем коде.

Однако, если вы уверены, что в одном блоке try... catch определенный вид исключения будет вызван только уникальной функцией, помещая их в тот же блок try также будет ОК.

-121--3545547-

Можно скомпилировать программу в основном режиме для повышения производительности среды выполнения.

1
ответ дан 6 December 2019 в 04:50
поделиться

No. Это довольно хорошая практика, чтобы сузить сферу применения, где возникают какие-то исключения. Я сделал это много в своем коде.

Однако, если вы уверены, что в одном блоке try... catch, определенный вид исключения будет вызван только уникальной функцией, помещая их в тот же блок try также OK.

-121--3545547-

Для повышения производительности среды выполнения можно скомпилировать программу в основном режиме.

-121--3761070-

Одним из способов выяснить это самостоятельно является наличие консольного приложения, где вы пытаетесь запустить отдельные фрагменты кода друг против друга и синхронизировать их. Как здесь .

0
ответ дан 6 December 2019 в 04:50
поделиться

In terms of general advice:

  • Старайтесь использовать как можно меньше циклов
  • По возможности перемещайте код из циклов
  • Избегайте копирования вещей (например, строк) в циклах
  • Избегайте создания объектов в циклах
  • Кэшируйте, где это оправдано (обычно небольшие объекты, создание которых занимает много времени), но убедитесь, что ваш кэш имеет хорошую политику утилизации, иначе он превратится в утечку памяти
1
ответ дан 6 December 2019 в 04:50
поделиться

Конечно. Вот что мы делаем:

  • Начнем путешествие с определения того, когда оно закончится. Ставьте значимые, ориентированные на клиента, реалистичные цели. (Как для скорости, так и для потребления ресурсов.)

  • Часто тщательно тестируйте свой код, чтобы убедиться, что вы достигаете своих целей по производительности.

  • Если вы достигли поставленных целей, не беспокойтесь о производительности. Все в порядке. Беспокойство об ошибках, надежности или функциях.

  • Если вы не достигли своих целей по производительности, запустите профилировщик. Используйте его, чтобы определить, какой код является наиболее опасным. Имеет смысл исправить только худший код; создание чего-то уже невероятно быстрого и легкого, немного быстрее и легче, не решит вашей проблемы с производительностью.

  • Перепишите медленный код, чтобы он стал более производительным. (Это сложный момент.) Убедитесь, что вы проверили его, чтобы убедиться, что он действительно лучше.

  • Если, несмотря на все ваши усилия, вы не можете сделать его достаточно хорошим, либо переоцените свои цели, либо отмените проект и потратьте свое время на то, в чем вы можете добиться успеха.

Продолжайте повторять это, пока что-нибудь не отправите.

7
ответ дан 6 December 2019 в 04:50
поделиться

Если бы один метод всегда был быстрее другого, они бы не стали включать более медленный метод.

Единственный инвариант, когда речь идет о производительности - это то, что вам нужно профилировать. Все вытекает из этого.

2
ответ дан 6 December 2019 в 04:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: