Задать вопрос

Что выбрать с++, с или go для алгоритма?

Суть сервиса будущего хранится 700 млн 64бит uint значений в оперативной памяти.
При обработке запроса, будет выбираться значения около 100.000 на каждый запрос, обрабатываться и возвращаться как результат.

Множество битовых операций предполагается по сути и for.
Есть ли преимущества у С перед С++, в плане скорости, пока тесты показывают похожую ситуацию, но методы в струкртурах это большой у С++ плюс перед С.

Go медленнее и "ест" в 3 раза больше памяти. Очень понравился, но! По синтаксису местами хуже чем С. И в С я могу также писать просто код без управления памятью.
D в 4 раза медленнее Go по моему тесту. Его нет смысла пробовать. Процессорное время тут очень дорого.

И второй вопрос, реально на нагрузке делать такие for и операции или плохо масштабируемо?

В С и С++ я начинающий, буду учиться по-ходу. Но 12 лет в Php+JS.

+ C и C++ можно сделать как модуль для NodeJS или расширение для Php - это огромный плюс перед Go и D

А если С++ использовать ли нестандартные библиотеки? Не замедлят ли код?
  • Вопрос задан
  • 3210 просмотров
Подписаться 3 Оценить 5 комментариев
Решения вопроса 2
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
Go изначально concurrent. Из коробки лучше масштабируется. Например для двух ядер что нибудь вроде
var Data []uint64             //700 млн 64бит uint значений
var Respond []uint64      //значения около 100.000 на каждый запрос
var res chan uint64         //канал передачи годных значений
func TakeFromData(DataPart []uint64, res chan uint64){  //функция фильтра которой передается часть данных и канал годных
       for _, val := range DtaPart{
              if Good(val){
                       res <- val           //пишет годные в канал
              }
      }
}
go TakeFromData(Data[:len(Data)/2], res)    //запускается конкурентно в отдельном потоке
go TakeFromData(Data[len(Data)/2:], res)    // несколько экземпляров
for val:=range res{                    //агрегатор в своем потоке читает из канала по мере фильтрации
    Respond:=append(Respond, val)            //и формирует результат
}
Конечно можно написать multithreaded на С, только мороки будет больше.
Ответ написан
AirWorker
@AirWorker
Node.js full stack web dev
> но методы в струкртурах это большой у С++ плюс перед С.

Ну кто-то ООП переболел в свое время, кто-то до сих пор болеет, а солидные мужчины не болели никогда.

> Процессорное время тут очень дорого.

Все три языка подходят. Думайте как разруливать concurrency. Go для этого изначально задумывался.

И вы не обязаны писать весь проект на c/c++/go. Можете написать затычную часть как микросервис, а сверху повесить хоть Ноду, хоть Python, Хоть PHP.

> + C и C++ можно сделать как модуль для NodeJS или расширение для Php

Я бы сделал микросервис. И в этом случае go тоже отлично подходит.

Я бы вибирал между С и go. С быстр, у go удобный concurrency.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@nirvimel
А я подобные числодробилки пишу на Python (не спешите смеяться) с применением Numba.
700 млн * 64бит == 5.6Гб памяти. У меня столько нет, поэтому я возьму половину.
Итак, выборка 100 тысяч 64-битных значений из 350 миллионов пролетает за 0.315 секунд, значит с 700 миллионами я почти уложился бы в 0.6 секунд. Все это на довольно дешевом Pentium.
Это явно предел производительности железа и никакие ассемблеры не смогут ускорить решение этой задачи (более, чем на несколько процентов).
import numba as nb
import numpy as np
import time

max_value = np.iinfo(np.intc).max


@nb.jit(nopython=True)
def search(src, dst):
    src_size, = src.shape
    dst_size, = dst.shape
    factor = max_value / src_size * dst_size
    dst_ptr = 0
    for src_ptr in range(src.size):
        value = src[src_ptr]
        if value < factor and dst_ptr < dst_size:
            dst[dst_ptr] = value
            dst_ptr += 1


def search_and_time_it(from_size, to_size):
    src = np.random.randint(max_value, size=from_size)
    dst = np.empty((to_size,))
    t1 = time.time()
    search(src, dst)
    t2 = time.time()
    print('search {0:,d} values from {1:,d} takes {2:.3f} seconds'.format(to_size, from_size, t2 - t1))


# search 100 000 values from 350 000 000
search_and_time_it(350 * 1000 * 1000, 100 * 1000)

Результат:
search 100,000 values from 350,000,000 takes 0.315 seconds
Ответ написан
mirrr
@mirrr
Программист и просто хороший человек
В С и С++ я начинающий, буду учиться по-ходу. Но 12 лет в Php+JS.

Нет времени объяснять, используйте Go!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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