Skip to content

Commit e1524cb

Browse files
committed
Implement multiplication by separating parameters
At this point, there is no need to use 128-bits integer multiplication and floating-point multiplication.
1 parent 3e7fd21 commit e1524cb

12 files changed

+936
-39
lines changed

Makefile

+8-5
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ PACKAGE_NAME = ljson
88

99
major_ver = 1
1010
minor_ver = 3
11-
patch_ver = 2
11+
patch_ver = 3
1212
staticlib = lib$(PACKAGE_NAME).a
1313
sharedlib = lib$(PACKAGE_NAME).so $(major_ver) $(minor_ver) $(patch_ver)
1414
testedbin = ljson
@@ -17,11 +17,14 @@ ldoublelib = libldouble.a
1717
ldoublebin = ldouble
1818

1919
INSTALL_HEADERS = json.h
20+
FMUL ?= 0
2021
DTOA ?= 0
21-
RBIT ?= 7
22+
RBIT ?= 11
2223
TCMP ?= 2
24+
25+
CPFLAGS += -DUSE_FLOAT_MUL_CONVERT=$(FMUL)
2326
CPFLAGS += -DJSON_DTOA_ALGORITHM=$(DTOA) # 0:ldouble 1:sprintf 2:grisu2 3:dragonbox
24-
CPFLAGS += -DLSHIFT_RESERVED_BIT=$(RBIT) # 1 <= RBIT <= 11
27+
CPFLAGS += -DLSHIFT_RESERVED_BIT=$(RBIT) # 2 <= RBIT <= 11
2528
CPFLAGS += -DAPPROX_TAIL_CMP_VAL=$(TCMP) # 0 <= TCMP <= 4
2629

2730
.PHONY: all clean install
@@ -33,10 +36,10 @@ object_byte_size=2304
3336
include inc.makes
3437
$(eval $(call add-liba-build,$(staticlib),json.c))
3538
$(eval $(call add-libso-build,$(sharedlib),json.c))
36-
$(eval $(call add-bin-build,$(testedbin),json_test.c,-static -L $(OBJ_PREFIX) -lljson,,$(OBJ_PREFIX)/$(staticlib)))
39+
$(eval $(call add-bin-build,$(testedbin),json_test.c,-L $(OBJ_PREFIX) $(call set_links,ljson),,$(OBJ_PREFIX)/$(staticlib)))
3740

3841
$(eval $(call add-liba-build,$(ldoublelib),ldouble.c))
39-
$(eval $(call add-bin-build,$(ldoublebin),ldouble_test.c,-static -L $(OBJ_PREFIX) -lldouble,,$(OBJ_PREFIX)/$(ldoublelib)))
42+
$(eval $(call add-bin-build,$(ldoublebin),ldouble_test.c,-L $(OBJ_PREFIX) $(call set_links,ldouble),,$(OBJ_PREFIX)/$(ldoublelib)))
4043

4144
all: $(BIN_TARGETS) $(LIB_TARGETS)
4245

README.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,14 @@ Note: 'O2' optimization level and default option compilation, the test files com
6666
> Test Platform: Ambarella CV25M Board | CPU: ARM CortexA53 | OS: Linux-5.15<br>
6767
> Test Result: LJSON parses 475% faster and prints 2836% faster than cJSON, LJSON parses 131% faster and prints 147% faster than RapidJSON
6868
69-
![AARCH64-Linux Test Result](test_result/test_for_aarch64.png)
69+
![AARCH64-Linux Test Result](image/test_for_aarch64.png)
7070

7171
> Test Platform: PC | CPU: Intel i7-10700 | OS: Ubuntu 18.04 (VirtualBox)<br>
7272
> Test Result: LJSON parses 560% faster and prints 3184% faster than cJSON, LJSON parses 75% faster and prints 133% faster than RapidJSON
7373
74-
![x86_64-Linux Test Result](test_result/test_for_x86_64.png)
74+
![x86_64-Linux Test Result](image/test_for_x86_64.png)
7575

76-
![ldouble-x86_64 Test Result](test_result/ldb_for_x86_64.png)
76+
![ldouble-x86_64 Test Result](image/ldb_for_x86_64.png)
7777

7878
## Contact
7979

README_zh-cn.md

+4-5
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ LJSON 是一个远远快于 cJSON、大幅度快于 RapidJSON 的 C 实现的 JS
66
LJSON 支持 JSON 的解析、打印、编辑,提供 DOM 和 SAX 接口,I/O 支持字符串和文件,且完全支持 nativejson-benchmark 的测试用例。
77
LJSON 默认使用个人开发的 ldouble 算法打印浮点数,和标准库对比可能只有第15位小数的区别,是目前最快的浮点数转字符串算法;也可选择个人优化过的 grisu2 算法或 dragonbox 算法。
88

9-
109
## 功能特点
1110

1211
* 更快:打印和解析速度比 cJSON 和 RapidJSON 都要快,速度最高可比 CJSON 快32倍,比 Rapid JSON 快1.5倍,见测试结果
@@ -67,19 +66,19 @@ make O=<编译输出目录> CROSS_COMPILE=<交叉编译器前缀> && make O=<编
6766
> 测试平台: Ambarella CV25M Board | CPU: ARM CortexA53 | OS: Linux-5.15<br>
6867
> 测试结果: LJSON 比cJSON 解析最快可达 475%,打印最快可达 2836%,LJSON 比 RapidJSON 解析最快可达 131%,打印最快可达 147%
6968
70-
![AARCH64-Linux测试结果](test_result/test_for_aarch64.png)
69+
![AARCH64-Linux测试结果](image/test_for_aarch64.png)
7170

7271
> 测试平台: PC | CPU: Intel i7-10700 | OS: Ubuntu 18.04 (VirtualBox)<br>
7372
> 测试结果: LJSON 比cJSON 解析最快可达 560%,打印最快可达 3184%,LJSON 比 RapidJSON 解析最快可达 75%,打印最快可达 133%
7473
75-
![x86_64-Linux测试结果](test_result/test_for_x86_64.png)
74+
![x86_64-Linux测试结果](image/test_for_x86_64.png)
7675

77-
![ldouble-x86_64测试结果](test_result/ldb_for_x86_64.png)
76+
![ldouble-x86_64测试结果](image/ldb_for_x86_64.png)
7877

7978
> 测试平台: Nationalchip STB | CPU: CSKY | DDR3: 128MB, 533MHz | OS: ECOS<br>
8079
> 注: 老版本测试结果,新版本删除了临时buffer,且解析速度提升了两倍
8180
82-
![ECOS测试结果](test_result/test_for_csky.png)
81+
![ECOS测试结果](image/test_for_csky.png)
8382

8483
## json对象结构
8584

File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

inc.makes

+42-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
# https://github.com/lengjingzju/cbuild-ng #
66
############################################
77

8-
############# Date: 2023-08-18 #############
8+
############# Date: 2023-08-28 #############
99

1010
# The default behavior only includes inc.env.mk and inc.ins.mk.
1111
# INC_MAKES can be set to a combination of `disenv` `conf` `app` `mod` `disins`.
@@ -109,7 +109,7 @@ DEP_PREFIX := $(DEPDIR)
109109
endif
110110

111111
define link_hdrs
112-
$(addprefix -I,$(addprefix $(DEP_PREFIX),/include /usr/include /usr/local/include) \
112+
$(addprefix -I,$(addprefix $(DEP_PREFIX),/include /usr/include /usr/local/include) \
113113
$(if $(SEARCH_HDRS),$(wildcard \
114114
$(addprefix $(DEP_PREFIX)/include/,$(SEARCH_HDRS)) \
115115
$(addprefix $(DEP_PREFIX)/usr/include/,$(SEARCH_HDRS)) \
@@ -178,6 +178,17 @@ endif
178178
export CROSS_COMPILE
179179
endif
180180

181+
ifeq ($(COMPILER_COLLECTION),clang)
182+
CC := $(CROSS_COMPILE)clang
183+
CPP := $(CROSS_COMPILE)clang -E
184+
CXX := $(CROSS_COMPILE)clang++
185+
AS := $(CROSS_COMPILE)llvm-as
186+
LD := $(CROSS_COMPILE)lld
187+
AR := $(CROSS_COMPILE)llvm-ar
188+
RANLIB := $(CROSS_COMPILE)llvm-ranlib
189+
OBJCOPY := $(CROSS_COMPILE)llvm-objcopy
190+
STRIP := $(CROSS_COMPILE)llvm-strip
191+
else
181192
CC := $(CROSS_COMPILE)gcc
182193
CPP := $(CROSS_COMPILE)gcc -E
183194
CXX := $(CROSS_COMPILE)g++
@@ -187,13 +198,25 @@ AR := $(CROSS_COMPILE)ar
187198
RANLIB := $(CROSS_COMPILE)ranlib
188199
OBJCOPY := $(CROSS_COMPILE)objcopy
189200
STRIP := $(CROSS_COMPILE)strip
201+
endif
190202
export CC CXX CPP AS LD AR RANLIB OBJCOPY STRIP
191203

192204
else # NATIVE_BUILD
193205

194206
undefine ARCH CROSS_COMPILE
195207
unexport ARCH CROSS_COMPILE
196208

209+
ifeq ($(COMPILER_COLLECTION),clang)
210+
CC := clang
211+
CPP := clang -E
212+
CXX := clang++
213+
AS := llvm-as
214+
LD := lld
215+
AR := llvm-ar
216+
RANLIB := llvm-ranlib
217+
OBJCOPY := llvm-objcopy
218+
STRIP := llvm-strip
219+
else
197220
CC := gcc
198221
CPP := gcc -E
199222
CXX := g++
@@ -203,6 +226,7 @@ AR := ar
203226
RANLIB := ranlib
204227
OBJCOPY := objcopy
205228
STRIP := strip
229+
endif
206230
export CC CXX CPP AS LD AR RANLIB OBJCOPY STRIP
207231

208232
endif # NATIVE_BUILD
@@ -449,11 +473,21 @@ endif
449473
imake_cpflags += $(SANITIZER_FLAG)
450474
imake_ldflags += $(SANITIZER_FLAG)
451475

476+
ifeq ($(ENV_ANALYZER),y)
477+
ifneq ($(filter %gcc,$(CC)), )
452478
# For more description, refer to https://gcc.gnu.org/onlinedocs/gcc-13.1.0/gcc/Static-Analyzer-Options.html
453-
ifeq ($(ENV_ANALYZER)-$(shell expr `$(CC) -dumpversion` \>= 10),y-1)
479+
ifeq ($(shell expr `PATH=$(PATH) $(CC) -dumpversion` \>= 10),1)
454480
imake_cpflags += -fanalyzer
455481
imake_ldflags += -fanalyzer
456482
endif
483+
else
484+
# For more description, refer to https://clang.llvm.org/docs/ClangStaticAnalyzer.html
485+
# clang --analyze -Xanalyzer -analyzer-checker=<package> <source-files>
486+
# <package> can be got from `clang -cc1 -analyzer-checker-help`
487+
imake_cpflags += --analyze
488+
imake_ldflags += --analyze
489+
endif
490+
endif
457491

458492
imake_cpflags += $(IMAKE_CPFLAGS)
459493
imake_ldflags += $(IMAKE_LDFLAGS)
@@ -481,6 +515,10 @@ define set_flags
481515
$(foreach v,$(2),$(eval $(1)_$(patsubst %,%.o,$(basename $(v))) := $(3)))
482516
endef
483517

518+
define set_links
519+
-Wl,-Bstatic $(addprefix -l,$(1)) -Wl,-Bdynamic $(addprefix -l,$(2))
520+
endef
521+
484522
define all_ver_obj
485523
$(strip \
486524
$(if $(word 4,$(1)), \
@@ -563,7 +601,7 @@ $$(OBJ_PREFIX)/$(1): PRIVATE_CPFLAGS := -fPIC $(4)
563601
$$(OBJ_PREFIX)/$(1): $$(call translate_obj,$(2)) $(3) $(5)
564602
@$(COLORECHO) "\033[032mlib:\033[0m \033[44m$$@\033[0m"
565603
@rm -f $$@
566-
@$$(AR) r $$@ $$(call translate_obj,$(2)) -c
604+
@$$(AR) rc $$@ $$(call translate_obj,$(2))
567605
ifneq ($(3), )
568606
@echo OPEN $$@ > [email protected] $(foreach lib,$(3),
569607
@echo ADDLIB $(lib) >> [email protected])

0 commit comments

Comments
 (0)