Является ли upsertasync в Couchbase действительно асинхронным?C#

Место общения программистов C#
Гость
 Является ли upsertasync в Couchbase действительно асинхронным?

Сообщение Гость »

Я пытался поднять некоторые документы в Couchbase, используя C#. Вот мой (очень простой) код. < /P>

Код: Выделить всё

var cluster = await Cluster.ConnectAsync("127.0.0.1", "Admin", "*****");
var bucket = await cluster.BucketAsync("Embedding");
var scope = await bucket.ScopeAsync("Testing");
var collection = await scope.CollectionAsync("Testing");

int i = 0;

Stopwatch stopwatch = Stopwatch.StartNew();

while (i < 10000)
{
string Id = "my-document-" + i;

var input = new { Name = "Ted", Number = i };

collection.UpsertAsync(Id,input);

i++;
}

stopwatch.Stop();

Console.WriteLine($"Complete in {stopwatch.ElapsedMilliseconds / 1000.00} seconds");
< /code>
Так что это просто подчеркивает 10000 документов этой простой формы. Я не могу поверить, что он выполняет всего около 150 документов в секунду. Мой товарищ по команде сказал, что это совершенно неприемлемо, он написал код Java, используя официальный SDK Couchbase, и это потребовалось всего 300 мс в документах с Uperting 10000.docker run -d --name db -p 8091-8096:8091-8096 -p 11210-11211:11210-11211 couchbase
< /code>
И это предлагается официальным веб -сайтом Couchbase, я не вытаскиваю из какого -то странного источника. Я использую процессор I5-8250U вместе с 12,0 ГБ оперативной памяти. Я думаю, что это слишком достаточное для подъема этих простых документов. Что связано с тем, что, когда мой товарищ по команде удалил асинхронную версию в своем коде Java, потребовалось 4 секунды, чтобы завершить это, поэтому я теперь подозреваю, что ряд в C# может не вести себя как асинхронное задание. Вопросы: 

  Хотя мой старый ноутбук (i5-8250U, 12,0 ГБ оперативной памяти) отличается, чем новый (i5-1135G7, 32,0 ГБ ОЗУ), так что скорость документов может отличаться как 150/1 и 10000/6s? Upsertasync в c# действительно асинхронно? Его скорость ведет себя очень похоже на несинхродический подъем в Java, как и то, что показал мне мой товарищ по команде.package com.ecom.demo.couchbase;

import com.couchbase.client.java.*;
import com.couchbase.client.java.kv.*;
import com.couchbase.client.java.json.*;
import com.couchbase.client.java.query.*;
import reactor.core.publisher.Mono;

import java.time.Duration;
import java.util.List;
import java.util.stream.IntStream;

public class StartUsing {
instance and credentials.
static String connectionString = "couchbase://192.168.11.11";
static String username = "Administrator";
static String password = "*****";
static String bucketName = "*****";

public static void main(String...  args) throws InterruptedException {
Cluster cluster = Cluster.connect(
connectionString,
ClusterOptions.clusterOptions(username, password).environment(env -> {
})
);

Bucket bucket = cluster.bucket(bucketName);
bucket.waitUntilReady(Duration.ofSeconds(10));

Scope scope = bucket.scope("test");
Collection collection = scope.collection("data");
ReactiveCollection reactiveCollection = collection.reactive();

System.out.println("connected");

int count = 10_000;

sync(count, collection);

//async(count, reactiveCollection);
}

static void sync(int count, Collection collection) {

long start = System.currentTimeMillis();

for (int i=1; i {
String id = "my-document-" + i;
JsonObject doc = JsonObject.create()
.put("name", "mike")
.put("age", i);
return reactiveCollection.upsert(id, doc)
.doOnError(error -> System.err.println("Upsert failed: " + error));
})
.toList();

Mono.when(upsertTasks)
.doOnTerminate(() -> {
long end = System.currentTimeMillis();
System.out.println("Total time (ms): " + (end - start));
})
.block();

long end = System.currentTimeMillis();

System.out.println(end - start);
}
}
< /code>
Тест на скорость на моем новом ноутбуке (32 ГБ один), используя секундомер, как в коде C#: < /p>
1 document = 0.022 seconds,
10 documents = 0.03 seconds,
100 documents = 0.074 seconds,
1000 documents = 0.412 seconds,
10000 documents = 5.713 seconds,
100000 documents = 55.072 seconds
< /code>
Ниже я тестирую на своем ноутбуке 32 ГБ с Java: < /p>
package com.ecom.demo.couchbase;

import com.couchbase.client.java.*;
import com.couchbase.client.java.kv.*;
import com.couchbase.client.java.json.*;
import com.couchbase.client.java.query.*;
import reactor.core.publisher.Mono;

import java.time.Duration;
import java.util.List;
import java.util.stream.IntStream;

public class StartUsing {

static String connectionString = "127.0.0.1";
static String username = "Administrator";
static String password = "*****";
static String bucketName = "Embedding";

public static void main(String...  args) throws InterruptedException {
Cluster cluster = Cluster.connect(
connectionString,
ClusterOptions.clusterOptions(username, password).environment(env -> {
})
);

Bucket bucket = cluster.bucket(bucketName);
bucket.waitUntilReady(Duration.ofSeconds(10));

// get a user-defined collection reference
Scope scope = bucket.scope("Testing");
Collection collection = scope.collection("Testing");
ReactiveCollection reactiveCollection = collection.reactive();

System.out.println("connected");

int count = 10_000;

sync(count, collection);

//async(count, reactiveCollection);

}

static void sync(int count, Collection collection) {

long start = System.currentTimeMillis();

for (int i=1; i {
String id = "my-document-" + i;
JsonObject doc = JsonObject.create()
.put("Name", "Ted")
.put("Number", i);
return reactiveCollection.upsert(id, doc)
.doOnError(error -> System.err.println("Upsert failed: " + error));
})
.toList();

Mono.when(upsertTasks)
.doOnTerminate(() -> {
long end = System.currentTimeMillis();
System.out.println("Total time (ms): " + (end - start));
})
.block();

long end = System.currentTimeMillis();

System.out.println(end - start);
}
}
Для 10000 документов синхронизация заняла 3,4 секунды, а Async заняла 1,62 секунды. /> Как указано Амосом, я также попробовал, что < /p>

Код: Выделить всё

Stopwatch stopwatch = Stopwatch.StartNew();

int i = 0;

var tasks = new Task[10000];

while (i < 10000)
{
string Id = "my-document-" + i;

var input = new { Name = "Ted", Number = i };

tasks[i] = collection.UpsertAsync(Id, input);

i++;
}

Task.WaitAll(tasks);

stopwatch.Stop();
Это заняло 6,55 секунды.

Подробнее здесь: https://stackoverflow.com/questions/794 ... ynchronous

Вернуться в «C#»