Как выбрать тип на основе потребностей времени выполнения? - PullRequest
0 голосов
/ 08 января 2012

У меня следующая ситуация, и я ожидаю некоторого совета экспертов от SO.

Я пишу приложение, и как часть этого мне нужно предоставить API для создания, модификациии удаление объекта (ов).Каждый создаваемый объект должен быть уникально идентифицирован (только с положительными идентификаторами)!

Система будет иметь следующее количество объектов в данный день.

  1. Минимальное - <50,000 objects (60% - 14.4/24 hrs)
  2. Среднее- >50,ooo but <65,000 objects (30% - 7.2/24 hrs)
  3. Пик - >65,000 but <100,000 objects (10% - 2.4/24 hrs)

Теперь вопрос в том, что должнобыть type идентификатора объекта?Корпус #1 и #2 поместится в пределах unsigned short int (2 bytes).Но он не может вместить объекты для случая #3.Поэтому case #3 требует более широкого типа, например int (4 bytes).

Я не хочу использовать int, когда система находится в случае #1 и случае #2 (90% времени), потому что, скажем, в настоящее время существует 65k объектов всистема, и если мы используем int для хранения идентификатора объекта, то мы будем использовать удвоенный объем памяти по сравнению с использованием unsigned short int.OTOH, когда система находится в пике (10% времени), нам определенно нужно int для хранения идентификатора объекта.

И, может быть, время, когда система колеблется между случаями #2 и #3 в зависимости от потребностей пользователей.

В C, есть ли способ справиться с этой ситуациейэффективным способом, то есть путем изменения type идентификатора объекта в зависимости от использования во время выполнения ?!

ПРИМЕЧАНИЕ: когда объекты удаляются, идентификатор удаленного объекта будет использоваться для создания следующего объекта.А обтекание идентификатора объекта будет выполняться только в угловом случае (до тех пор, пока это не будет абсолютно необходимо).

Ответы [ 5 ]

3 голосов
/ 08 января 2012

Язык C не поддерживает динамическое изменение типа чего-либо.Вы могли бы, вероятно, выяснить, как это сделать так или иначе, но это может потребовать компиляции большей части вашего кода дважды (один раз для 16-битных целых и один раз для 32-битных целых) и затем выбрать во время выполнения, какую версиюкод для запуска.Это звучит как огромная боль, и это сэкономит вам максимум 200 кБ памяти (если вообще что-то).

Ваш компьютер, вероятно, уже имеет гигабайты памяти, поэтому я не могу себе представить, что 200 кБ будут иметь значение,Если вы на самом деле работаете на древней машине с 16 МБ памяти, то попросите своего босса о лучшей машине.Программисты дороги, а оборудование дешевое.

1 голос
/ 08 января 2012

Это, похоже, случай преждевременной оптимизации , вы пытаетесь оптимизировать объем памяти, прежде чем даже узнаете, станет ли это проблемой для рабочего сервера, на котором вы работаете.

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

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

1 голос
/ 08 января 2012

Если использование памяти критично для вас, вы можете использовать сложный идентификатор, который будет состоять из беззнакового короткого и беззнакового символа - вы получите 24-битный идентификатор, и этого будет достаточно для 2 ^ 24 = 16777216 объектов.Конечно, это окажет некоторое влияние на производительность, но таким образом вы можете избавиться от перераспределения пространства для идентификаторов.

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

0 голосов
/ 08 января 2012

Это может быть аналогично реализации типа pid_t для идентификатора процесса в Linux. пользователю Linux предоставляется возможность увеличить максимальное количество процессов / потоков, создаваемых путем изменения файла /proc/sys/kernel/pid_max. Другая идея состоит в том, чтобы попытаться создать opaque types как уже упоминалось здесь .

0 голосов
/ 08 января 2012

Если эффективность памяти имеет значение, взгляните на хитрость, которую использует UTF-8 кодировка .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...