В основном этот тип медлительности происходит из-за совершения этой ошибки:
for (var i = 0; i<100; i++)
{
// do a network-roundtrip/remoting/io/etc
}
, и решение состоит в том, чтобы изменить его на:
// do a network-roundtrip/remoting/io/etc
for (var i = 0; i<100; i++)
{
// do something with the result of the above call
}
Так что, если я правильно вас понял, данные Global.holidayGlobals.Values
поступают из другого процесса, например, из кеша памяти. Если это так, вам проще всего изменить код на:
int limit=450;
public bool functionUI()
{
var holidays = Global.holidayGlobals.Values;
for(int i=0;i< limit ; i++)
{
functionApp(i, holidays);
}
}
public static bool functionApp(int i, IEnumerable<HolidayEntity> holidays)
{
foreach(var h in holidays)
{
if(h.Value == i)
{
return false;
}
}
return true;
}
Мы все еще делаем слишком много работы в циклах (мы можем улучшить алгоритм, создав словарь и просто просмотрев его), но для по вашему номеру (450) это ничтожно мало по сравнению со временем одной поездки туда и обратно в кэш памяти.
ОБНОВЛЕНИЕ
Из комментариев к вопросу видно, что holidays
равно Dictionary<int, HolidayEntity>
, если так, код может стать намного лучше, как это:
Ну, принципиальное различие:
AllocConsole()
создаст новую консоль (и присоединит к нему),AttachConsole( ATTACH_PARENT_PROCESS /* -1 */)
не создаст новую консоль, она присоединит к существующей консоли родительского процесса.В первом случае Вы получаете совершенно новую консоль во втором случае, Вы используете существующую консоль.
Конечно, если Вы уже привязаны к консоли (т.е., Вы - программа консольного режима, запущенная из cmd.exe) нет большого различия - Вы получите ошибку с любым API.
Также обратите внимание, что просто, потому что Вы отсоединяетесь от консоли, не означает, что отдельная консоль будет полезна - например, если Вы будете консольным процессом, запущенным из cmd окна, того окна по существу блоки, пока Ваш процесс не заканчивается.
Некоторый код для проигрывания с:
int main( int argc, char* argv[])
{
int ch;
BOOL bResult;
printf( "default console\n");
ch = getchar();
bResult = FreeConsole();
bResult = AllocConsole();
printf( "AllocConsole()\n");
ch = getchar();
bResult = FreeConsole();
bResult = AttachConsole( ATTACH_PARENT_PROCESS);
printf( "AttachConsole( ATTACH_PARENT_PROCESS)\n");
ch = getchar();
return 0;
}
Это было некоторое время, так как я использовал winapi, но я искал документацию MSDN, и я не смог найти API-функцию CreateConsole. Таким образом, мое предположение - то, что CreateConsole является материалом прежней версии и был заменен AttachConsole. Таким образом, нет, вероятно, никакого различия, но CreateConsole был, вероятно, удержан от использования.
Я не думаю, что существует вызванная функция CreateConsole
, но существует AllocConsole
.
Принятие этого - то, что Вы имели в виду, я думаю, что различие - это AttachConsole(ATTACH_PARENT_PROCESS)
может возвратиться ERROR_INVALID_HANDLE
если родительский процесс не имеет консоли.
Попытайтесь выполнить этот код от обоих командная строка и Запуститесь-> Выполнение:
#include <windows.h>
#pragma comment ( lib, "user32.lib" )
int main()
{
BOOL b;
char msg[1024];
b = FreeConsole();
sprintf(msg, "%d", b);
MessageBox(NULL, msg, "FreeConsole", 0);
b = AttachConsole(ATTACH_PARENT_PROCESS);
sprintf(msg, "%d", b);
MessageBox(NULL, msg, "AttachConsole", 0);
return 0;
}
Когда выполнено от командной строки, два окна сообщения, содержащие a 1
отображены, означая оба вызова, за которыми следуют. Когда выполнено от Запуска-> Выполнение, первое поле содержит 1
и второе содержит 0
, подразумевать, что только первый вызов, за которым следуют. Второй перестал работать, потому что explorer.exe (который является родителем процесса, запущенного от Запуска-> Выполнение) не имеет консоли.