文档章节

代码优化的一点总结

o
 osc_mervd488
发布于 2018/04/23 19:38
字数 718
阅读 8
收藏 0

精选30+云产品,助力企业轻松上云!>>>

很多时候,为了赶项目进度,或是没有合适的代码review机制,再是每个程序员的水平高低各不相同。以下几点就是最近优化接口时做的一些调整。

  • 如果使用循环不停地去操作数据库,请把这个循环放在service层中,并且使用@Transactional,这样,就保证多次的数据库操作在一个事务中,不会不断地开启提交事务。不建议要放在controller层或action层中。 举例代码如下:
    @Transactional
    @Override
    public List<Content> collectContents(Set<String> contentIds) {
        if (contentIds.isEmpty()) {
            return new ArrayList<>();
        }

        Integer[] ids = contentIds.stream()
                .map(id -> Integer.parseInt(id))
                .collect(Collectors.toList())
                .toArray(new Integer[contentIds.size()]);

        return dao.queryContentsInOne(ids);
    }
  • 如果需要获取redis的多个keys或批量操作时,推荐使用pipeline,减少网络通讯开销。 举例代码如下:
Pipeline pipeline = jedis.pipelined();

        List<String> uIds = new LinkedList<>(followingUsers);
        for(String userId : uIds) {
            pipeline.exists(getFormatKeyStr(USER_CONTENT_ZSET, userId));
        }
Pipeline zaddPipeline = jedis.pipelined();
        if(Objects.nonNull(followingUpUserContents) && followingUpUserContents.size() > 0) {
            followingUpUserContents.forEach(content -> {
                zaddPipeline.zadd(getFormatKeyStr(USER_CONTENT_ZSET, content.getUser().getId()),
                        content.getSortDate().getTime(),
                        String.valueOf(content.getId()));
            });

            zaddPipeline.sync();
        }
  • 熟悉数据表的定义结构,每个字段的类型和长度,以及建立了哪些索引,哪些索引是必需的,哪些是可以去掉的,再是使用explain命令,来查看你要编写的sql语句是否使用了索引。

  • 在项目中遇到了OOM溢出,原因是原来Hibernate使用redis作为二级缓存,后因为redis需要大量的网络通信,后更换为Ehcache,结果就OOM了。其原因是Ehcache需要大量内存缓存查询结果,一开始分配的内存并不多。解决办法,增加内存。

  • 时刻记得null和为空的情况,可以使用Optional来解决。 举例代码如下:

package crazy;

import java.util.Optional;

class Company {
	private String name;
	private Optional<Office> office;

	public Company(String name, Optional<Office> office) {
		this.name = name;
		this.office = office;
	}

	public String getName() {
		return name;
	}

	public Optional<Office> getOffice() {
		return office;
	}
}

class Office {
	private String id;
	private Optional<Address> address;

	public Office(String id, Optional<Address> address) {
		this.id = id;
		this.address = address;
	}

	public String getId() {
		return id;
	}

	public Optional<Address> getAddress() {
		return address;
	}
}

class Address {
	private Optional<String> street;
	private Optional<String> city;

	public Address(Optional<String> street, Optional<String> city) {
		this.street = street;
		this.city = city;
	}

	public Optional<String> getStreet() {
		return street;
	}

	public Optional<String> getCity() {
		return city;
	}
}

public class OptionalDemo1 {

	public static void main(String[] args) {
		Optional<Address> address1 = Optional.of(new Address(Optional.ofNullable(null), Optional.of("New York")));
		Optional<Office> office1 = Optional.of(new Office("OF1", address1));
		Optional<Company> company1 = Optional.of(new Company("Door Never Closed", office1));

		// What is the street address of company1?
		// In which city company1 is located?
		Optional<Office> maybeOffice = company1.flatMap(Company::getOffice);
		Optional<Address> maybeAddress = office1.flatMap(Office::getAddress);
		Optional<String> maybeStreet = address1.flatMap(Address::getStreet);

		maybeStreet.ifPresent(System.out::println);
		if (maybeStreet.isPresent()) {
			System.out.println(maybeStreet.get());
		} else {
			System.out.println("Street not found.");
		}
		
		// shorter way
		String city = company1.flatMap(Company::getOffice)
				.flatMap(Office::getAddress)
				.flatMap(Address::getStreet)
				.orElse("City is not found.");
		
		System.out.println("City: " + city);
		
		 // only print if city is not null
        company1.flatMap(Company::getOffice)
                .flatMap(Office::getAddress)
                .flatMap(Address::getCity)
                .ifPresent(System.out::println);

	}
}
  • 如果常见的优化手段并不明显,可以考虑使用临时表。

最重要的一点是: 写代码的时候,不要只盯着代码,要想你写的代码在内存或是在程序中是如何执行的。

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
2019年一季度计划

2019年一季度计划   现在是2019年2月11日(农历正月初七)上午09:29,春节后第一天上班。感觉工作生活计划都应该在春节后写。节前写的话,过了一个春节长假(15天),回来啥都忘了。春节前...

osc_pb5yyzq7
2019/02/11
2
0
Java 代码性能优化总结

Java 代码性能优化总结 1.尽量减少对变量的重复计算 明确一个概念,对方法的调用,即使方法中只有一句语句,也是有消耗的,包括创建栈帧、调用方法时保护现场、调用方法完毕时恢复现场等。所...

messi_10
2015/11/27
184
6
《深入理解计算机系统》之代码优化

读书笔记第6周《深入理解计算机体系结构》 主要看了第5章,优化程序性能。如同老师所说的,程序优化的技巧是需要平时不断积累,而且通过阅读这一章,充分体会到,真正想要做到程序的优化,下...

osc_goqlvk0e
2018/04/14
1
0
其实我们可以少写点if else和switch

前言 作为搬砖在第一线的底层工人,业务场景从来是没有做不到只有想不到的复杂。 不过他强任他强,if-else全搞定,搬就完了。但是随着业务迭代或者项目交接,自己在看自己或者别人的if代码的...

osc_57h7mkgj
2019/01/09
4
0
Eigen vs Numpy时间对比

Eigen vs Numpy时间对比 有人说Eigen太慢了,用Numpy好一点,我们来看一看是不是这样的 Eigen C++ 程序 t_time.cpp 使用cmake 来编译 或者直接编译:输出结果: Numpy 程序 t_time.py 输出结果:...

osc_jww09jef
2018/06/28
7
0

没有更多内容

加载失败,请刷新页面

加载更多

平时使用的Lszrz到底是什么协议?说说Xmodem/Ymodem/Zmodem

XMODEM, YMODEM, and ZMODEM 由于平时使用rz/sz较多,r/s好理解,一个send一个receive。但是由不太清楚z是什么意思,故有此文。 sx/rx, sb/rb (b=batch)和sz/rz分别实现了xmodem,ymodem和z...

独钓渔
今天
17
0
真正的强智能时代已经到来。道翰天琼认知智能机器人平台API大脑。

最近,我常说人工智能的寒冬快要来了,提醒业界要做好思想准备,但同时我也说:冬天来了,春天就不会远了…… 2019年6月我写了篇文章《深度学习的问题究竟在哪?》,说到深度学习的一个主要问...

jackli2020
今天
24
0
什么是控制型人格,控制型人格的筛查测试

一、 什么是控制性人格 拥有控制型人格的人,他们会尽力的隐藏自己的意图,但是又会使用很微妙的方式来利用周围人的弱点,进而占取便宜时,使他们能够得到自己想要的东西。这类人的控制欲非常...

蛤蟆丸子
今天
14
0
【Spring】Spring AOP 代理对象生成逻辑源码分析

1. spring aop案例(POJO注入) 1.0 被代理接口 TargetInterface /** * 被代理的接口 * @author Yang ZhiWei */public interface TargetInterface { void show(); String show......

ZeroneLove
今天
36
0
聊聊dubbo-go的gracefulShutdownFilter

序 本文主要研究一下dubbo-go的gracefulShutdownFilter gracefulShutdownFilter dubbo-go-v1.4.2/filter/filter_impl/graceful_shutdown_filter.go type gracefulShutdownFilter struct {......

go4it
今天
30
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部